"The work flow will be: createVMSnapshot api -> VMSnapshotManagerImpl: creatVMSnapshot -> VMSnapshotStrategy: takeVMSnapshot -> storage driver:takeVMSnapshot"
I also think it's a bit weird for the storage driver to have any knowledge of VM snapshots. I would think another part of the system would quiesce (or not) the VM in question and then the takeSnapshot method would be called on the driver. I might have missed something...why does the driver "care" if the snapshot to be taken is going to be in a consistent state or not (I understand why the user care, but not the storage driver)? Why is that not a problem for some other part of the system that is aware of hypervisor snapshots? Shouldn't the driver just take a snapshot (or snapshots) as it is instructed to do (regardless of whether or not a VM is quiesced)? Basically I'm wondering why we need two "take snapshot" methods on the driver. On Wed, Oct 9, 2013 at 11:24 PM, Mike Tutkowski < mike.tutkow...@solidfire.com> wrote: > Yeah, I'm not really clear how the snapshot strategy works if you have > multiple vendors that implement that interface either. > > > On Wed, Oct 9, 2013 at 10:12 PM, Darren Shepherd < > darren.s.sheph...@gmail.com> wrote: > >> Edison, >> >> I would lean toward doing the coarse grain interface only. I'm having >> a hard time seeing how the whole flow is generic and makes sense for >> everyone. With starting with the coarse grain you have the advantage >> in that you avoid possible upfront over engineering/over design that >> could wreak havoc down the line. If you implement the >> VMSnapshotStrategy and find that it really is useful to other >> implementations, you can then implement the fine grain interface later >> to allow others to benefit from it. >> >> Darren >> >> On Wed, Oct 9, 2013 at 8:54 PM, Mike Tutkowski >> <mike.tutkow...@solidfire.com> wrote: >> > Hey guys, >> > >> > I haven't been giving this thread much attention, but am reviewing it >> > somewhat now. >> > >> > I'm not really clear how this would work if, say, a VM has two data >> disks >> > and they are not being provided by the same vendor. >> > >> > Can someone clarify that for me? >> > >> > My understanding for how this works today is that it doesn't matter. For >> > XenServer, a VDI is on an SR, which could be supported by storage >> vendor X. >> > Another VDI could be on another SR, supported by storage vendor Y. >> > >> > In this case, a new VDI appears on each SR after a hypervisor snapshot. >> > >> > Same idea for VMware. >> > >> > I don't really know how (or if) this works for KVM. >> > >> > I'm not clear how this multi-vendor situation would play out in this >> > pluggable approach. >> > >> > Thanks! >> > >> > >> > On Tue, Oct 8, 2013 at 4:43 PM, Edison Su <edison...@citrix.com> wrote: >> > >> >> >> >> >> >> > -----Original Message----- >> >> > From: Darren Shepherd [mailto:darren.s.sheph...@gmail.com] >> >> > Sent: Tuesday, October 08, 2013 2:54 PM >> >> > To: dev@cloudstack.apache.org >> >> > Subject: Re: [DISCUSS] Pluggable VM snapshot related operations? >> >> > >> >> > A hypervisor snapshot will snapshot memory also. So determining >> whether >> >> The memory is optional for hypervisor vm snapshot, a.k.a, the >> "Disk-only >> >> snapshots": >> >> >> http://support.citrix.com/proddocs/topic/xencenter-61/xs-xc-vms-snapshots-about.html >> >> It's supported by both xenserver/kvm/vmware. >> >> >> >> > do to the hypervisor snapshot from the quiesce option does not seem >> >> > proper. >> >> > >> >> > Sorry, for all the questions, I'm trying to get to the point of >> >> understand if this >> >> > functionality makes sense at this point of code or if maybe their is >> a >> >> different >> >> > approach. This is what I'm seeing, what if we state it this way >> >> > >> >> > 1) VM snapshot, AFAIK, are not backed up today and exist solely on >> >> primary. >> >> > What if we added a backup phase to VM snapshots that can be >> optionally >> >> > supported by the storage providers to possibly backup the VM snapshot >> >> > volumes. >> >> It's not about backup vm snapshot, it's about how to take vm snapshot. >> >> Usually, take/revert vm snapshot is handled by hypervisor itself, but >> in >> >> NetApp(or other storage vendor) case, >> >> They want to change the default behavior of hypervisor-base vm >> snapshot. >> >> >> >> Some examples: >> >> 1. take hypervisor based vm snapshots, on primary storage, hypervisor >> will >> >> maintain the snapshot chain. >> >> 2. take vm snapshot through NetApp: >> >> a. first, quiesce VM if user specified. There is no separate API >> to >> >> quiesce VM on the hypervisor, so here we will >> >> take a VM snapshot through hypervisor API call, hypervisor will take >> >> volume snapshot on each volume of the VM. Let's say, on the primary >> >> storage, the disk chain looks like: >> >> base-image >> >> | >> >> V >> >> Parent disk >> >> / \ >> >> V V >> >> Current disk snapshot-a >> >> b. from snapshot-a, find out its parent disk, then take snapshot >> >> through NetApp >> >> c. un- quiesce VM, here, go to hypervisor, delete snapshot >> >> "snapshot-a", hypervisor should be able to consolidate current disk and >> >> "parent disk" into one disk, thus from hypervisor point of view >> >> , there is always, at most, only one snapshot for the VM. >> >> For revert VM snapshot, as long as the VM is stopped, NetApp can >> >> revert the snapshot created on NetApp storage easily, and efficiently. >> >> The benefit of this whole process, as Chris pointed out, if the >> >> snapshot chain is quite long, hypervisor based VM snapshot will get >> >> performance hit. >> >> >> >> > >> >> > 2) Additionally you want to be able to backup multiple disks at once, >> >> > regardless of VM snapshot. Why don't we add the ability to put >> >> volumeIds in >> >> > snapshot cmd that if the storage provider supports it will get a >> batch of >> >> > volumeIds. >> >> > >> >> > Now I know we talked about 2 and there was some concerns about it >> (mostly >> >> > from me), but I think we could work through those concerns (forgot >> what >> >> > they were...). Right now I just get the feeling we are shoehorning >> some >> >> > functionality into VM snapshot that isn't quite the right fit. The >> "no >> >> quiesce" >> >> > flow just doesn't seem to make sense to me. >> >> >> >> >> >> Not sure above NetApp proposed work flow makes sense to you or to other >> >> body or not. If this work flow is only specific to NetApp, then we >> don't >> >> need to enforce the whole process for everybody. >> >> >> >> > >> >> > Darren >> >> > >> >> > On Tue, Oct 8, 2013 at 2:05 PM, SuichII, Christopher >> >> > <chris.su...@netapp.com> wrote: >> >> > > Whether the hypervisor snapshot happens depends on whether the >> >> > 'quiesce' option is specified with the snapshot request. If a user >> >> doesn't care >> >> > about the consistency of their backup, then the hypervisor >> >> snapshot/quiesce >> >> > step can be skipped altogether. This of course is not the case if the >> >> default >> >> > provider is being used, in which case a hypervisor snapshot is the >> only >> >> way of >> >> > creating a backup since it can't be offloaded to the storage driver. >> >> > > >> >> > > -- >> >> > > Chris Suich >> >> > > chris.su...@netapp.com >> >> > > NetApp Software Engineer >> >> > > Data Center Platforms - Cloud Solutions Citrix, Cisco & Red Hat >> >> > > >> >> > > On Oct 8, 2013, at 4:57 PM, Darren Shepherd >> >> > > <darren.s.sheph...@gmail.com> >> >> > > wrote: >> >> > > >> >> > >> Who is going to decide whether the hypervisor snapshot should >> >> > >> actually happen or not? Or how? >> >> > >> >> >> > >> Darren >> >> > >> >> >> > >> On Tue, Oct 8, 2013 at 12:38 PM, SuichII, Christopher >> >> > >> <chris.su...@netapp.com> wrote: >> >> > >>> >> >> > >>> -- >> >> > >>> Chris Suich >> >> > >>> chris.su...@netapp.com >> >> > >>> NetApp Software Engineer >> >> > >>> Data Center Platforms - Cloud Solutions Citrix, Cisco & Red Hat >> >> > >>> >> >> > >>> On Oct 8, 2013, at 2:24 PM, Darren Shepherd >> >> > <darren.s.sheph...@gmail.com> wrote: >> >> > >>> >> >> > >>>> So in the implementation, when we say "quiesce" is that actually >> >> > >>>> being implemented as a VM snapshot (memory and disk). And then >> >> > >>>> when you say "unquiesce" you are talking about deleting the VM >> >> > snapshot? >> >> > >>> >> >> > >>> If the VM snapshot is not going to the hypervisor, then yes, it >> will >> >> > actually be a hypervisor snapshot. Just to be clear, the unquiesce is >> >> not quite >> >> > a delete - it is a collapse of the VM snapshot and the active VM back >> >> into one >> >> > file. >> >> > >>> >> >> > >>>> >> >> > >>>> In NetApp, what are you snapshotting? The whole netapp volume >> (I >> >> > >>>> don't know the correct term), a file on NFS, an iscsi volume? I >> >> > >>>> don't know a whole heck of a lot about the netapp snapshot >> >> > capabilities. >> >> > >>> >> >> > >>> Essentially we are using internal APIs to create file level >> backups >> >> - don't >> >> > worry too much about the terminology. >> >> > >>> >> >> > >>>> >> >> > >>>> I know storage solutions can snapshot better and faster than >> >> > >>>> hypervisors can with COW files. I've personally just been >> always >> >> > >>>> perplexed on whats the best way to implement it. For storage >> >> > >>>> solutions that are block based, its really easy to have the >> storage >> >> > >>>> doing the snapshot. For shared file systems, like NFS, its >> seems >> >> > >>>> way more complicated as you don't want to snapshot the entire >> >> > >>>> filesystem in order to snapshot one file. >> >> > >>> >> >> > >>> With filesystems like NFS, things are certainly more complicated, >> >> but that >> >> > is taken care of by our controller's operating system, Data ONTAP, >> and we >> >> > simply use APIs to communicate with it. >> >> > >>> >> >> > >>>> >> >> > >>>> Darren >> >> > >>>> >> >> > >>>> On Tue, Oct 8, 2013 at 11:10 AM, SuichII, Christopher >> >> > >>>> <chris.su...@netapp.com> wrote: >> >> > >>>>> I can comment on the second half. >> >> > >>>>> >> >> > >>>>> Through storage operations, storage providers can create >> backups >> >> > much faster than hypervisors and over time, their snapshots are more >> >> > efficient than the snapshot chains that hypervisors create. It is >> true >> >> that a VM >> >> > snapshot taken at the storage level is slightly different as it >> would be >> >> psuedo- >> >> > quiesced, not have it's memory snapshotted. This is accomplished >> through >> >> > hypervisor snapshots: >> >> > >>>>> >> >> > >>>>> 1) VM snapshot request (lets say VM 'A' >> >> > >>>>> 2) Create hypervisor snapshot (optional) -VM 'A' is >> snapshotted, >> >> > >>>>> creating active VM 'A*' >> >> > >>>>> -All disk traffic now goes to VM 'A*' and A is a snapshot of >> 'A*' >> >> > >>>>> 3) Storage driver(s) take snapshots of each volume >> >> > >>>>> 4) Undo hypervisor snapshot (optional) -VM snapshot 'A' is >> rolled >> >> > >>>>> back into VM 'A*' so the hypervisor snapshot no longer exists >> >> > >>>>> >> >> > >>>>> Now, a couple notes: >> >> > >>>>> -The reason this is optional is that not all users necessarily >> >> care about >> >> > the memory or disk consistency of their VMs and would prefer faster >> >> > snapshots to consistency. >> >> > >>>>> -Preemptively, yes, we are actually taking hypervisor snapshots >> >> which >> >> > means there isn't actually a performance of taking storage snapshots >> when >> >> > quiescing the VM. However, the performance gain will come both during >> >> > restoring the VM and during normal operations as described above. >> >> > >>>>> >> >> > >>>>> Although you can think of it as a poor man's VM snapshot, I >> would >> >> > think of it more as a consistent multi-volume snapshot. Again, the >> >> difference >> >> > being that this snapshot was not truly quiesced like a hypervisor >> >> snapshot >> >> > would be. >> >> > >>>>> >> >> > >>>>> -- >> >> > >>>>> Chris Suich >> >> > >>>>> chris.su...@netapp.com >> >> > >>>>> NetApp Software Engineer >> >> > >>>>> Data Center Platforms - Cloud Solutions Citrix, Cisco & Red Hat >> >> > >>>>> >> >> > >>>>> On Oct 8, 2013, at 1:47 PM, Darren Shepherd >> >> > <darren.s.sheph...@gmail.com> wrote: >> >> > >>>>> >> >> > >>>>>> My only comment is that having the return type as boolean and >> >> > >>>>>> using to that indicate quiesce behaviour seems obscure and >> will >> >> > >>>>>> probably lead to a problem later. Your basically saying the >> >> > >>>>>> result of the takeVMSnapshot will only ever need to >> communicate >> >> > >>>>>> back whether unquiesce needs to happen. Maybe some result >> >> > object >> >> > >>>>>> would be more extensible. >> >> > >>>>>> >> >> > >>>>>> Actually, I think I have more comments. This seems a bit odd >> to >> >> me. >> >> > >>>>>> Why would a storage driver in ACS implement a VM snapshot >> >> > >>>>>> functionality? VM snapshot is a really a hypervisor >> orchestrated >> >> > >>>>>> operation. So it seems like were trying to implement a poor >> mans >> >> > >>>>>> VM snapshot. Maybe if I understood what NetApp was trying to >> do >> >> > >>>>>> it would make more sense, but its all odd. To do a proper VM >> >> > >>>>>> snapshot you need to snapshot memory and disk at the exact >> same >> >> > >>>>>> time. How are we going to do that if ACS is orchestrating >> the VM >> >> > >>>>>> snapshot and delegating to storage providers. Its not like >> you >> >> > >>>>>> are going to pause the VM.... or are you? >> >> > >>>>>> >> >> > >>>>>> Darren >> >> > >>>>>> >> >> > >>>>>> On Mon, Oct 7, 2013 at 11:59 AM, Edison Su < >> edison...@citrix.com> >> >> > wrote: >> >> > >>>>>>> I created a design document page at >> >> > >> https://cwiki.apache.org/confluence/display/CLOUDSTACK/Pluggable+VM+s >> >> > napshot+related+operations, feel free to add items on it. >> >> > >>>>>>> And a new branch "pluggable_vm_snapshot" is created. >> >> > >>>>>>> >> >> > >>>>>>>> -----Original Message----- >> >> > >>>>>>>> From: SuichII, Christopher [mailto:chris.su...@netapp.com] >> >> > >>>>>>>> Sent: Monday, October 07, 2013 10:02 AM >> >> > >>>>>>>> To: <dev@cloudstack.apache.org> >> >> > >>>>>>>> Subject: Re: [DISCUSS] Pluggable VM snapshot related >> operations? >> >> > >>>>>>>> >> >> > >>>>>>>> I'm a fan of option 2 - this gives us the most flexibility >> (as >> >> > >>>>>>>> you stated). The option is given to completely override the >> way >> >> > >>>>>>>> VM snapshots work AND storage providers are given to >> >> > >>>>>>>> opportunity to work within the default VM snapshot workflow. >> >> > >>>>>>>> >> >> > >>>>>>>> I believe this option should satisfy your concern, Mike. The >> >> > >>>>>>>> snapshot and quiesce strategy would be in charge of >> >> > communicating with the hypervisor. >> >> > >>>>>>>> Storage providers should be able to leverage the default >> >> > >>>>>>>> strategies and simply perform the storage operations. >> >> > >>>>>>>> >> >> > >>>>>>>> I don't think it should be much of an issue that new method >> to >> >> > >>>>>>>> the storage driver interface may not apply to everyone. In >> fact, >> >> > that is already the case. >> >> > >>>>>>>> Some methods such as un/maintain(), attachToXXX() and >> >> > >>>>>>>> takeSnapshot() are already not implemented by every driver - >> >> > >>>>>>>> they just return false when asked if they can handle the >> >> operation. >> >> > >>>>>>>> >> >> > >>>>>>>> -- >> >> > >>>>>>>> Chris Suich >> >> > >>>>>>>> chris.su...@netapp.com >> >> > >>>>>>>> NetApp Software Engineer >> >> > >>>>>>>> Data Center Platforms - Cloud Solutions Citrix, Cisco & Red >> Hat >> >> > >>>>>>>> >> >> > >>>>>>>> On Oct 5, 2013, at 12:11 AM, Mike Tutkowski >> >> > >>>>>>>> <mike.tutkow...@solidfire.com> >> >> > >>>>>>>> wrote: >> >> > >>>>>>>> >> >> > >>>>>>>>> Well, my first thought on this is that the storage driver >> >> > >>>>>>>>> should not be telling the hypervisor to do anything. It >> should >> >> > >>>>>>>>> be responsible for creating/deleting volumes, snapshots, >> etc. >> >> on >> >> > its storage system only. >> >> > >>>>>>>>> >> >> > >>>>>>>>> >> >> > >>>>>>>>> On Fri, Oct 4, 2013 at 5:57 PM, Edison Su < >> >> edison...@citrix.com> >> >> > wrote: >> >> > >>>>>>>>> >> >> > >>>>>>>>>> In 4.2, we added VM snapshot for Vmware/Xenserver. The >> >> > >>>>>>>>>> current workflow will be like the following: >> >> > >>>>>>>>>> createVMSnapshot api -> VMSnapshotManagerImpl: >> >> > >>>>>>>>>> creatVMSnapshot -> send CreateVMSnapshotCommand to >> >> > hypervisor to create vm snapshot. >> >> > >>>>>>>>>> >> >> > >>>>>>>>>> If anybody wants to change the workflow, then need to >> either >> >> > >>>>>>>>>> change VMSnapshotManagerImpl directly or subclass >> >> > VMSnapshotManagerImpl. >> >> > >>>>>>>>>> Both are not the ideal choice, as VMSnapshotManagerImpl >> >> > >>>>>>>>>> should be able to handle different ways to take vm >> snapshot, >> >> > instead of hard code. >> >> > >>>>>>>>>> >> >> > >>>>>>>>>> The requirements for the pluggable VM snapshot coming >> from: >> >> > >>>>>>>>>> Storage vendor may have their optimization, such as >> NetApp. >> >> > >>>>>>>>>> VM snapshot can be implemented in a totally different >> way(For >> >> > >>>>>>>>>> example, I could just send a command to guest VM, to tell >> my >> >> > >>>>>>>>>> application to flush disk and hold disk write, then come >> to >> >> > >>>>>>>>>> hypervisor to >> >> > >>>>>>>> take a volume snapshot). >> >> > >>>>>>>>>> >> >> > >>>>>>>>>> If we agree on enable pluggable VM snapshot, then we can >> >> > move >> >> > >>>>>>>>>> on discuss how to implement it. >> >> > >>>>>>>>>> >> >> > >>>>>>>>>> The possible options: >> >> > >>>>>>>>>> 1. coarse grained interface. Add a VMSnapshotStrategy >> >> > >>>>>>>>>> interface, which has the following interfaces: >> >> > >>>>>>>>>> VMSnapshot takeVMSnapshot(VMSnapshot vmSnapshot); >> >> > Boolean >> >> > >>>>>>>>>> revertVMSnapshot(VMSnapshot vmSnapshot); Boolean >> >> > >>>>>>>>>> DeleteVMSnapshot(VMSnapshot vmSnapshot); >> >> > >>>>>>>>>> >> >> > >>>>>>>>>> The work flow will be: createVMSnapshot api -> >> >> > >>>>>>>> VMSnapshotManagerImpl: >> >> > >>>>>>>>>> creatVMSnapshot -> VMSnapshotStrategy: takeVMSnapshot >> >> > >>>>>>>>>> VMSnapshotManagerImpl will manage VM state, do the sanity >> >> > >>>>>>>>>> check, then will handle over to VMSnapshotStrategy. >> >> > >>>>>>>>>> In VMSnapshotStrategy implementation, it may just send a >> >> > >>>>>>>>>> Create/revert/delete VMSnapshotCommand to hypervisor >> >> > host, or >> >> > >>>>>>>>>> do anything special operations. >> >> > >>>>>>>>>> >> >> > >>>>>>>>>> 2. fine-grained interface. Not only add a >> VMSnapshotStrategy >> >> > >>>>>>>>>> interface, but also add certain methods on the storage >> driver. >> >> > >>>>>>>>>> The VMSnapshotStrategy interface will be the same as >> option 1. >> >> > >>>>>>>>>> Will add the following methods on storage driver: >> >> > >>>>>>>>>> /* volumesBelongToVM is the list of volumes of the VM >> that >> >> > >>>>>>>>>> created on this storage, storage vendor can either take >> one >> >> > >>>>>>>>>> snapshot for this volumes in one shot, or take snapshot >> for >> >> > each volume separately >> >> > >>>>>>>>>> The pre-condition: vm is unquiesced. >> >> > >>>>>>>>>> It will return a Boolean to indicate, do need >> unquiesce vm >> >> or >> >> > not. >> >> > >>>>>>>>>> In the default storage driver, it will return false. >> >> > >>>>>>>>>> */ >> >> > >>>>>>>>>> boolean takeVMSnapshot(List<VolumeInfo> >> >> > volumesBelongToVM, >> >> > >>>>>>>>>> VMSnapshot vmSnapshot); Boolean >> >> > >>>>>>>>>> revertVMSnapshot(List<VolumeInfo> volumesBelongToVM, >> >> > >>>>>>>>>> VMSnapshot vmSnapshot); Boolean >> >> > >>>>>>>>>> deleteVMSnapshot(List<VolumeInfo> volumesBelongToVM, >> >> > >>>>>>>>>> VMSnapshot vmSNapshot); >> >> > >>>>>>>>>> >> >> > >>>>>>>>>> The work flow will be: createVMSnapshot api -> >> >> > >>>>>>>> VMSnapshotManagerImpl: >> >> > >>>>>>>>>> creatVMSnapshot -> VMSnapshotStrategy: takeVMSnapshot -> >> >> > >>>>>>>>>> storage driver:takeVMSnapshot In the implementation of >> >> > >>>>>>>>>> VMSnapshotStrategy's takeVMSnapshot, the pseudo code >> >> > looks like: >> >> > >>>>>>>>>> HypervisorHelper.quiesceVM(vm); >> >> > >>>>>>>>>> val volumes = vm.getVolumes(); >> >> > >>>>>>>>>> val maps = new Map[driver, list[VolumeInfo]](); >> >> > >>>>>>>>>> Volumes.foreach(volume => maps.put(volume.getDriver, >> >> > volume :: >> >> > >>>>>>>>>> maps.get(volume.getdriver()))) >> >> > >>>>>>>>>> val needUnquiesce = true; >> >> > >>>>>>>>>> maps.foreach((driver, volumes) => needUnquiesce = >> >> > >>>>>>>>>> needUnquiesce && driver.takeVMSnapshot(volumes)) >> >> > >>>>>>>>>> if (needUnquiesce ) { >> >> > >>>>>>>>>> HypervisorHelper.unquiesce(vm); } >> >> > >>>>>>>>>> >> >> > >>>>>>>>>> By default, the quiesceVM in HypervisorHelper will >> actually >> >> > >>>>>>>>>> take vm snapshot through hypervisor. >> >> > >>>>>>>>>> Does above logic makes senesce? >> >> > >>>>>>>>>> >> >> > >>>>>>>>>> The pros of option 1 is that: it's simple, no need to >> change >> >> > >>>>>>>>>> storage driver interfaces. The cons is that each storage >> >> > >>>>>>>>>> vendor need to implement a strategy, maybe they will do >> the >> >> > same thing. >> >> > >>>>>>>>>> The pros of option 2 is that, storage driver won't need to >> >> > >>>>>>>>>> worry about how to quiesce/unquiesce vm. The cons is >> that, it >> >> > >>>>>>>>>> will add these methods on each storage drivers, so it >> assumes >> >> > >>>>>>>>>> that this work flow will work for everybody. >> >> > >>>>>>>>>> >> >> > >>>>>>>>>> So which option we should take? Or if you have other >> options, >> >> > >>>>>>>>>> please let's know. >> >> > >>>>>>>>>> >> >> > >>>>>>>>>> >> >> > >>>>>>>>>> >> >> > >>>>>>>>>> >> >> > >>>>>>>>>> >> >> > >>>>>>>>>> >> >> > >>>>>>>>> >> >> > >>>>>>>>> >> >> > >>>>>>>>> -- >> >> > >>>>>>>>> *Mike Tutkowski* >> >> > >>>>>>>>> *Senior CloudStack Developer, SolidFire Inc.* >> >> > >>>>>>>>> e: mike.tutkow...@solidfire.com >> >> > >>>>>>>>> o: 303.746.7302 >> >> > >>>>>>>>> Advancing the way the world uses the >> >> > >>>>>>>>> cloud<http://solidfire.com/solution/overview/?video=play> >> >> > >>>>>>>>> *(tm)* >> >> > >>>>>>> >> >> > >>>>> >> >> > >>> >> >> > > >> >> >> > >> > >> > >> > -- >> > *Mike Tutkowski* >> > *Senior CloudStack Developer, SolidFire Inc.* >> > e: mike.tutkow...@solidfire.com >> > o: 303.746.7302 >> > Advancing the way the world uses the >> > cloud<http://solidfire.com/solution/overview/?video=play> >> > *™* >> > > > > -- > *Mike Tutkowski* > *Senior CloudStack Developer, SolidFire Inc.* > e: mike.tutkow...@solidfire.com > o: 303.746.7302 > Advancing the way the world uses the > cloud<http://solidfire.com/solution/overview/?video=play> > *™* > -- *Mike Tutkowski* *Senior CloudStack Developer, SolidFire Inc.* e: mike.tutkow...@solidfire.com o: 303.746.7302 Advancing the way the world uses the cloud<http://solidfire.com/solution/overview/?video=play> *™*