# StorPool CloudStack Integration ## CloudStack Overview ### Primary and Secondary storage Primary storage is associated with a cluster or zone, and it stores the virtual disks for all the VMs running on hosts in that cluster/zone. Secondary storage stores the following: * Templates — OS images that can be used to boot VMs and can include additional configuration information, such as installed applications * ISO images — disc images containing data or bootable media for operating systems * Disk volume snapshots — saved copies of VM data which can be used for data recovery or to create new templates ### ROOT and DATA volumes ROOT volumes correspond to the boot disk of a VM. They are created automatically by CloudStack during VM creation. ROOT volumes are created based on a system disk offering, corresponding to the service offering the user VM is based on. We may change the ROOT volume disk offering but only to another system created disk offering. DATA volumes correspond to additional disks. These can be created by users and then attached/detached to VMs. DATA volumes are created based on a user-defined disk offering. ## Plugin Organization The StorPool plugin consists of two parts: ### KVM hypervisor plugin patch Source directory: ./apache-cloudstack-4.17-src/plugins/hypervisors/kvm ### StorPool primary storage plugin Source directory: ./apache-cloudstack-4.17.0-src/plugins/storage/volume There is one plugin for both the CloudStack management and agents, in the hope that having all the source in one place will ease development and maintenance. The plugin itself though is separated into two mainly independent parts: * ./src/com/... directory tree: agent related classes and commands send from management to agent * ./src/org/... directory tree: management related classes The plugin is intended to be self contained and non-intrusive, thus ideally deploying it would consist of only dropping the jar file into the appropriate places. This is the reason why all StorPool related communication (ex. data copying, volume resize) is done with StorPool specific commands even when there is a CloudStack command that does pretty much the same. Note that for the present the StorPool plugin may only be used for a single primary storage cluster; support for multiple clusters is planned. ## Build, Install, Setup ### Build Go to the source directory and run: mvn -Pdeveloper -DskipTests install The resulting jar file is located in the target/ subdirectory. Note: checkstyle errors: before compilation a code style check is performed; if this fails compilation is aborted. In short: no trailing whitespace, indent using 4 spaces, not tabs, comment-out or remove unused imports. Note: Need to build both the KVM plugin and the StorPool plugin proper. ### Install #### StorPool primary storage plugin For each CloudStack management host: ```bash scp ./target/cloud-plugin-storage-volume-storpool-{version}.jar {MGMT_HOST}:/usr/share/cloudstack-management/lib/ ``` For each CloudStack agent host: ```bash scp ./target/cloud-plugin-storage-volume-storpool-{version}.jar {AGENT_HOST}:/usr/share/cloudstack-agent/plugins/ ``` Note: CloudStack managements/agents services must be restarted after adding the plugin to the respective directories Note: Agents should have access to the StorPool management API, since attach and detach operations happens on the agent. This is a CloudStack design issue, can't do much about it. ### Setup #### Setting up StorPool Perform the StorPool installation following the StorPool Installation Guide. Create a template to be used by CloudStack. Must set *placeHead*, *placeAll*, *placeTail* and *replication*. No need to set default volume size because it is determined by the CloudStack disks and services offering. #### Setting up a StorPool PRIMARY storage pool in CloudStack From the WEB UI, go to Infrastructure -> Primary Storage -> Add Primary Storage Scope: select Zone-Wide Hypervisor: select KVM Zone: pick appropriate zone. Name: user specified name Protocol: select *SharedMountPoint* Path: enter */dev/storpool* (required argument, actually not needed in practice). Provider: select *StorPool* Managed: leave unchecked (currently ignored) Capacity Bytes: used for accounting purposes only. May be more or less than the actual StorPool template capacity. Capacity IOPS: currently not used (may use for max IOPS limitations on volumes from this pool). URL: enter SP_API_HTTP=address:port;SP_AUTH_TOKEN=token;SP_TEMPLATE=template_name. At present one template can be used for at most one Storage Pool. SP_API_HTTP - address of StorPool Api SP_AUTH_TOKEN - StorPool's token SP_TEMPLATE - name of StorPool's template > **NOTE:** You can use the alternative format option for the URL - storpool://{SP_AUTH_TOKEN}@{SP_API_HTTP}:{SP_API_HTTP_PORT}/{SP_TEMPLATE} Storage Tags: If left blank, the StorPool storage plugin will use the pool name to create a corresponding storage tag. This storage tag may be used later, when defining service or disk offerings. ## Plugin Functionality
| Plugin Action | CloudStack Action | management/agent | impl. details |
|---|---|---|---|
| Create ROOT volume from ISO | create VM from ISO | management | createVolumeAsync |
| Create ROOT volume from Template | create VM from Template | management + agent | copyAsync (T => T, T => V) |
| Create DATA volume | create Volume | management | createVolumeAsync |
| Attach ROOT/DATA volume | start VM (+attach/detach Volume) | agent | connectPhysicalDisk |
| Detach ROOT/DATA volume | stop VM | agent | disconnectPhysicalDiskByPath |
| Migrate VM | agent | attach + detach | |
| Delete ROOT volume | destroy VM (expunge) | management | deleteAsync |
| Delete DATA volume | delete Volume (detached) | management | deleteAsync |
| Create ROOT/DATA volume snapshot | snapshot volume | management + agent | takeSnapshot + copyAsync (S => S) |
| Create volume from snapshoot | create volume from snapshot | management + agent(?) | copyAsync (S => V) |
| Create TEMPLATE from ROOT volume | create template from volume | management + agent | copyAsync (V => T) |
| Create TEMPLATE from snapshot | create template from snapshot | SECONDARY STORAGE | |
| Download volume | download volume | management + agent | copyAsync (V => V) |
| Revert ROOT/DATA volume to snapshot | revert to snapshot | management | revertSnapshot |
| (Live) resize ROOT/DATA volume | resize volume | management + agent | resize + StorpoolResizeCmd |
| Delete SNAPSHOT (ROOT/DATA) | delete snapshot | management | StorpoolSnapshotStrategy |
| Delete TEMPLATE | delete template | agent | deletePhysicalDisk |
| migrate VM/volume | migrate VM/volume to another storage | management/management + agent | copyAsync (V => V) |
| VM snapshot | group snapshot of VM's disks | management | StorpoolVMSnapshotStrategy takeVMSnapshot |
| revert VM snapshot | revert group snapshot of VM's disks | management | StorpoolVMSnapshotStrategy revertVMSnapshot |
| delete VM snapshot | delete group snapshot of VM's disks | management | StorpoolVMSnapshotStrategy deleteVMSnapshot |
| VM vc_policy tag | vc_policy tag for all disks attached to VM | management | StorPoolCreateTagsCmd |
| delete VM vc_policy tag | remove vc_policy tag for all disks attached to VM | management | StorPoolDeleteTagsCmd |