cloudstack-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Mike Tutkowski <mike.tutkow...@solidfire.com>
Subject Re: Review Request 14381: KVM: add connect/disconnect capabilities to StorageAdaptors so that external storage services can attach/detach devices on-demand
Date Wed, 23 Oct 2013 19:57:02 GMT
You know, I forgot we supposed to be doing that! :) Multi-tasking too much
today, I guess.

Anyways, it must not be working because I still had a hypervisor connection
after I shut down the VM.

Let me investigate.


On Wed, Oct 23, 2013 at 1:48 PM, Marcus Sorensen <shadowsor@gmail.com>wrote:

> Are we not disconnecting when we stop the vm? There's a method for it, we
> should be. disconnectPhysicalDiskViaVmSpec
> On Oct 23, 2013 1:28 PM, "Mike Tutkowski" <mike.tutkowski@solidfire.com>
> wrote:
>
>> I see one problem for us now, Marcus.
>>
>> * You have a running VM that you attach a volume to.
>> * You stop the VM.
>> * You detach the volume.
>> * You start up the VM.
>>
>> The VM will not be connected to the volume (which is good), but the
>> hypervisor will still be connected to the volume.
>>
>> It would be great if we actually sent a command to the last host ID of
>> the stopped VM when detaching a volume (to have the hypervisor disconnect
>> from the volume).
>>
>> What do you think about that?
>>
>>
>> On Wed, Oct 23, 2013 at 1:15 PM, Mike Tutkowski <
>> mike.tutkowski@solidfire.com> wrote:
>>
>>> OK, whatever way you prefer then, Marcus (createVdb first or second).
>>>
>>> If I leave createVdb first and return 0, it does seem to work.
>>>
>>>
>>> On Wed, Oct 23, 2013 at 11:13 AM, Marcus Sorensen <shadowsor@gmail.com>wrote:
>>>
>>>> I think we could flip-flop these two lines if necessary:
>>>>
>>>>             createVbd(conn, vmSpec, vmName, vm);
>>>>
>>>>             _storagePoolMgr.connectPhysicalDisksViaVmSpec(vmSpec);
>>>>
>>>> I haven't actually tried it though. But in general I don't see the
>>>> Libvirt DiskDef using size at all, which is what createVbd does
>>>> (creates XML definitions for disks to attach to the VM definition). It
>>>> just takes the device at it's native advertised size when it actually
>>>> goes to use it.
>>>>
>>>> On Wed, Oct 23, 2013 at 10:52 AM, Mike Tutkowski
>>>> <mike.tutkowski@solidfire.com> wrote:
>>>> > Little problem that I wanted to get your take on, Marcus.
>>>> >
>>>> > When a VM is being started, we call createVdb before calling
>>>> > connectPhysicalDisksViaVmSpec.
>>>> >
>>>> > The problem is that createVdb calls getPhysicalDisk and my volume has
>>>> not
>>>> > yet been connected because connectPhysicalDisksViaVmSpec has not yet
>>>> been
>>>> > called.
>>>> >
>>>> > When I try to read up the size of the disk to populate a
>>>> PhysicalDisk, I get
>>>> > an error, of course, because the path does not yet exist.
>>>> >
>>>> > I could populate a 0 for the size of the physical disk and then the
>>>> next
>>>> > time getPhysicalDisk is called, it should be filled in with a proper
>>>> size.
>>>> >
>>>> > Do you see a problem with that approach?
>>>> >
>>>> >
>>>> > On Tue, Oct 22, 2013 at 6:40 PM, Marcus Sorensen <shadowsor@gmail.com
>>>> >
>>>> > wrote:
>>>> >>
>>>> >> That's right. All should be well.
>>>> >>
>>>> >> On Oct 22, 2013 6:03 PM, "Mike Tutkowski" <
>>>> mike.tutkowski@solidfire.com>
>>>> >> wrote:
>>>> >>>
>>>> >>> Looks like we disconnect physical disks when the VM is stopped.
>>>> >>>
>>>> >>> I didn't see that before.
>>>> >>>
>>>> >>> I suppose that means the disks are physically disconnected when
the
>>>> VM is
>>>> >>> stopped, but the CloudStack DB still has the VM associated with
the
>>>> disks
>>>> >>> for the next time the VM may be started up (unless someone does
a
>>>> disconnect
>>>> >>> while the VM is in the Stopped State).
>>>> >>>
>>>> >>>
>>>> >>> On Tue, Oct 22, 2013 at 4:19 PM, Mike Tutkowski
>>>> >>> <mike.tutkowski@solidfire.com> wrote:
>>>> >>>>
>>>> >>>> Hey Marcus,
>>>> >>>>
>>>> >>>> Quick question for you related to attaching/detaching volumes
when
>>>> the
>>>> >>>> VM is in the Stopped State.
>>>> >>>>
>>>> >>>> If I detach a volume from a VM that is in the Stopped State,
the DB
>>>> >>>> seems to get updated, but I don't see a command going to
the KVM
>>>> hypervisor
>>>> >>>> that leads to the removal of the iSCSI target.
>>>> >>>>
>>>> >>>> It seems the iSCSI target is only removed the next time
the VM is
>>>> >>>> started.
>>>> >>>>
>>>> >>>> Do you know if this is true?
>>>> >>>>
>>>> >>>> If it is, I'm concerned that the volume could be attached
to
>>>> another VM
>>>> >>>> before the Stopped VM is re-started and when the Stopped
VM gets
>>>> restarted
>>>> >>>> that it would disconnect the iSCSI volume from underneath
the VM
>>>> that now
>>>> >>>> has the volume attached.
>>>> >>>>
>>>> >>>> I still want to perform some tests on this, but am first
trying to
>>>> get a
>>>> >>>> VM to start after I've attached a volume to it when it was
in the
>>>> Stopped
>>>> >>>> State.
>>>> >>>>
>>>> >>>> Thanks,
>>>> >>>> Mike
>>>> >>>>
>>>> >>>>
>>>> >>>> On Mon, Oct 21, 2013 at 10:57 PM, Mike Tutkowski
>>>> >>>> <mike.tutkowski@solidfire.com> wrote:
>>>> >>>>>
>>>> >>>>> Thanks for that info, Marcus.
>>>> >>>>>
>>>> >>>>> By the way, I wanted to see if I could attach my volume
to a VM
>>>> in the
>>>> >>>>> Stopped State.
>>>> >>>>>
>>>> >>>>> The attach logic didn't trigger any exceptions; however,
when I
>>>> started
>>>> >>>>> the VM, I received an Insufficient Capacity exception.
>>>> >>>>>
>>>> >>>>> If I detach the volume and then start the VM, the VM
starts just
>>>> fine.
>>>> >>>>>
>>>> >>>>> I noticed a problem here (in StoragePoolHostDaoImpl):
>>>> >>>>>
>>>> >>>>>     @Override
>>>> >>>>>
>>>> >>>>>     public StoragePoolHostVO findByPoolHost(long poolId,
long
>>>> hostId) {
>>>> >>>>>
>>>> >>>>>         SearchCriteria<StoragePoolHostVO> sc =
>>>> PoolHostSearch.create();
>>>> >>>>>
>>>> >>>>>         sc.setParameters("pool_id", poolId);
>>>> >>>>>
>>>> >>>>>         sc.setParameters("host_id", hostId);
>>>> >>>>>
>>>> >>>>>         return findOneIncludingRemovedBy(sc);
>>>> >>>>>
>>>> >>>>>     }
>>>> >>>>>
>>>> >>>>> The findOneIncludingRemovedBy method returns null (the
poolId is
>>>> my
>>>> >>>>> storage pool's ID and the hostId is the expected host
ID).
>>>> >>>>>
>>>> >>>>> I'm not sure what this method is trying to do.
>>>> >>>>>
>>>> >>>>> I looked in the storage_pool_host_ref table (is that
the correct
>>>> >>>>> table?) and it only has one row, which maps the local
storage
>>>> pool of the
>>>> >>>>> KVM host to the KVM host (which explains why no match
is found
>>>> for my
>>>> >>>>> situation).
>>>> >>>>>
>>>> >>>>> Do you understand what this logic is trying to do?
>>>> >>>>>
>>>> >>>>> Thanks!
>>>> >>>>>
>>>> >>>>>
>>>> >>>>>
>>>> >>>>> On Mon, Oct 21, 2013 at 8:08 PM, Marcus Sorensen <
>>>> shadowsor@gmail.com>
>>>> >>>>> wrote:
>>>> >>>>>>
>>>> >>>>>> Do you have the capability to clone the root disk?
Normally the
>>>> >>>>>> template is installed to primary, and then cloned
for each root
>>>> disk.
>>>> >>>>>> In some cases (such as CLVM), this isn't efficient
and so the
>>>> template
>>>> >>>>>> is copied fresh to populate each root disk.
>>>> >>>>>>
>>>> >>>>>> I'm actually not 100% sure how this works in the
new code. It
>>>> used to
>>>> >>>>>> be handled by copyPhysicalDisk in the storage adaptor,
called by
>>>> >>>>>> copyTemplateToPrimaryStorage, which runs on the
agent. It would
>>>> pass
>>>> >>>>>> template/secondary storage info, and the destination
>>>> volume/primary
>>>> >>>>>> storage info, and copyPhysicalDisk would do the
work of
>>>> installing the
>>>> >>>>>> image to the destination.  Then subsequent root
disks would be
>>>> cloned
>>>> >>>>>> in CreateCommand by calling createDiskFromTemplate.
>>>> >>>>>>
>>>> >>>>>> In master it looks like this was moved to KVMStorageProcessor
>>>> >>>>>> 'cloneVolumeFromBaseTemplate', although I think
this just takes
>>>> over
>>>> >>>>>> as default, and there's something in your storage
driver that
>>>> should
>>>> >>>>>> be capable of cloning templates on the mgmt server
side. I'm
>>>> less sure
>>>> >>>>>> about how the template gets to primary storage in
the first
>>>> place, I
>>>> >>>>>> assume copyTemplateToPrimaryStorage in KVMStorageProcessor
>>>> calling
>>>> >>>>>> copyPhysicalDisk in your adaptor. It's a bit tough
for me to tell
>>>> >>>>>> since our earlier storage adaptor did everything
on the host it
>>>> mostly
>>>> >>>>>> just worked with the default stuff.
>>>> >>>>>>
>>>> >>>>>> On Mon, Oct 21, 2013 at 4:49 PM, Mike Tutkowski
>>>> >>>>>> <mike.tutkowski@solidfire.com> wrote:
>>>> >>>>>> > Hey Marcus,
>>>> >>>>>> >
>>>> >>>>>> > So...now that this works well for data disks,
I was wondering
>>>> what
>>>> >>>>>> > might be
>>>> >>>>>> > involved in getting this process to work for
root disks.
>>>> >>>>>> >
>>>> >>>>>> > Can you point me in the right direction as
far as what gets
>>>> invoked
>>>> >>>>>> > when a
>>>> >>>>>> > VM is being created on KVM (so that its root
disk can be
>>>> created and
>>>> >>>>>> > the
>>>> >>>>>> > necessary template laid down or ISO installed)?
>>>> >>>>>> >
>>>> >>>>>> > Thanks!
>>>> >>>>>> >
>>>> >>>>>> >
>>>> >>>>>> > On Mon, Oct 21, 2013 at 1:14 PM, Mike Tutkowski
>>>> >>>>>> > <mike.tutkowski@solidfire.com> wrote:
>>>> >>>>>> >>
>>>> >>>>>> >> Hey Marcus,
>>>> >>>>>> >>
>>>> >>>>>> >> Just wanted to let you know the branch
of mine that has your
>>>> code
>>>> >>>>>> >> and mine
>>>> >>>>>> >> appears to work well with regards to attaching
a data disk to
>>>> a
>>>> >>>>>> >> running VM:
>>>> >>>>>> >>
>>>> >>>>>> >> fdisk -l from hypervisor:
>>>> >>>>>> >>
>>>> >>>>>> >> http://i.imgur.com/NkP5fo0.png
>>>> >>>>>> >>
>>>> >>>>>> >> fdisk -l from within VM:
>>>> >>>>>> >>
>>>> >>>>>> >> http://i.imgur.com/8YwiiC7.png
>>>> >>>>>> >>
>>>> >>>>>> >> I plan to do more testing on this over
the coming days.
>>>> >>>>>> >>
>>>> >>>>>> >> If all goes well, perhaps we can check
this code in by the
>>>> end of
>>>> >>>>>> >> the
>>>> >>>>>> >> week?
>>>> >>>>>> >>
>>>> >>>>>> >> Talk to you later,
>>>> >>>>>> >> Mike
>>>> >>>>>> >>
>>>> >>>>>> >>
>>>> >>>>>> >> On Sun, Oct 20, 2013 at 10:23 PM, Mike
Tutkowski
>>>> >>>>>> >> <mike.tutkowski@solidfire.com> wrote:
>>>> >>>>>> >>>
>>>> >>>>>> >>> Don't ask me, but it works now (I've
been having this trouble
>>>> >>>>>> >>> quite a
>>>> >>>>>> >>> while today).
>>>> >>>>>> >>>
>>>> >>>>>> >>> I guess the trick is to send you an
e-mail. :)
>>>> >>>>>> >>>
>>>> >>>>>> >>>
>>>> >>>>>> >>> On Sun, Oct 20, 2013 at 10:05 PM, Marcus
Sorensen
>>>> >>>>>> >>> <shadowsor@gmail.com>
>>>> >>>>>> >>> wrote:
>>>> >>>>>> >>>>
>>>> >>>>>> >>>> Did you create a service offering
that uses local storage,
>>>> or add
>>>> >>>>>> >>>> a
>>>> >>>>>> >>>> shared primary storage? By default
there is no storage that
>>>> >>>>>> >>>> matches the
>>>> >>>>>> >>>> built in offerings.
>>>> >>>>>> >>>>
>>>> >>>>>> >>>> On Oct 20, 2013 9:39 PM, "Mike
Tutkowski"
>>>> >>>>>> >>>> <mike.tutkowski@solidfire.com>
>>>> >>>>>> >>>> wrote:
>>>> >>>>>> >>>>>
>>>> >>>>>> >>>>> Hey Marcus,
>>>> >>>>>> >>>>>
>>>> >>>>>> >>>>> So, I went back to the branch
of mine that has your code
>>>> and
>>>> >>>>>> >>>>> mine and
>>>> >>>>>> >>>>> was able to create a new CloudStack
install from scratch
>>>> with it
>>>> >>>>>> >>>>> (once
>>>> >>>>>> >>>>> again, after manually deleting
what was in
>>>> >>>>>> >>>>> /var/lib/libvirt/images to
the
>>>> >>>>>> >>>>> get system VMs to start).
>>>> >>>>>> >>>>>
>>>> >>>>>> >>>>> Anyways, my system VMs are
running now and I tried to kick
>>>> off a
>>>> >>>>>> >>>>> VM
>>>> >>>>>> >>>>> using the CentOS 6.3 image
you provided me a while back.
>>>> >>>>>> >>>>>
>>>> >>>>>> >>>>> The virtual router has a Status
of Running; however, my VM
>>>> fails
>>>> >>>>>> >>>>> to
>>>> >>>>>> >>>>> start (with the generic message
of Insufficient Capacity).
>>>> >>>>>> >>>>>
>>>> >>>>>> >>>>> I've not seen this exception
before (related to the VR).
>>>> Do you
>>>> >>>>>> >>>>> have
>>>> >>>>>> >>>>> any insight into this?:
>>>> >>>>>> >>>>>
>>>> >>>>>> >>>>> com.cloud.exception.ResourceUnavailableException:
Resource
>>>> >>>>>> >>>>> [Pod:1] is
>>>> >>>>>> >>>>> unreachable: Unable to apply
userdata and password entry on
>>>> >>>>>> >>>>> router
>>>> >>>>>> >>>>> at
>>>> >>>>>> >>>>>
>>>> >>>>>> >>>>>
>>>> com.cloud.network.router.VirtualNetworkApplianceManagerImpl.applyRules(VirtualNetworkApplianceManagerImpl.java:3793)
>>>> >>>>>> >>>>> at
>>>> >>>>>> >>>>>
>>>> >>>>>> >>>>>
>>>> com.cloud.network.router.VirtualNetworkApplianceManagerImpl.applyUserData(VirtualNetworkApplianceManagerImpl.java:3017)
>>>> >>>>>> >>>>> at
>>>> >>>>>> >>>>>
>>>> >>>>>> >>>>>
>>>> com.cloud.network.element.VirtualRouterElement.addPasswordAndUserdata(VirtualRouterElement.java:933)
>>>> >>>>>> >>>>> at
>>>> >>>>>> >>>>>
>>>> >>>>>> >>>>>
>>>> org.apache.cloudstack.engine.orchestration.NetworkOrchestrator.prepareElement(NetworkOrchestrator.java:1172)
>>>> >>>>>> >>>>> at
>>>> >>>>>> >>>>>
>>>> >>>>>> >>>>>
>>>> org.apache.cloudstack.engine.orchestration.NetworkOrchestrator.prepareNic(NetworkOrchestrator.java:1288)
>>>> >>>>>> >>>>> at
>>>> >>>>>> >>>>>
>>>> >>>>>> >>>>>
>>>> org.apache.cloudstack.engine.orchestration.NetworkOrchestrator.prepare(NetworkOrchestrator.java:1224)
>>>> >>>>>> >>>>> at
>>>> >>>>>> >>>>>
>>>> >>>>>> >>>>>
>>>> com.cloud.vm.VirtualMachineManagerImpl.advanceStart(VirtualMachineManagerImpl.java:826)
>>>> >>>>>> >>>>> at
>>>> >>>>>> >>>>>
>>>> >>>>>> >>>>>
>>>> com.cloud.vm.VirtualMachineManagerImpl.start(VirtualMachineManagerImpl.java:508)
>>>> >>>>>> >>>>> at
>>>> >>>>>> >>>>>
>>>> >>>>>> >>>>>
>>>> org.apache.cloudstack.engine.cloud.entity.api.VMEntityManagerImpl.deployVirtualMachine(VMEntityManagerImpl.java:227)
>>>> >>>>>> >>>>> at
>>>> >>>>>> >>>>>
>>>> >>>>>> >>>>>
>>>> org.apache.cloudstack.engine.cloud.entity.api.VirtualMachineEntityImpl.deploy(VirtualMachineEntityImpl.java:209)
>>>> >>>>>> >>>>> at
>>>> >>>>>> >>>>>
>>>> >>>>>> >>>>>
>>>> com.cloud.vm.UserVmManagerImpl.startVirtualMachine(UserVmManagerImpl.java:3338)
>>>> >>>>>> >>>>> at
>>>> >>>>>> >>>>>
>>>> >>>>>> >>>>>
>>>> com.cloud.vm.UserVmManagerImpl.startVirtualMachine(UserVmManagerImpl.java:2919)
>>>> >>>>>> >>>>> at
>>>> >>>>>> >>>>>
>>>> >>>>>> >>>>>
>>>> com.cloud.vm.UserVmManagerImpl.startVirtualMachine(UserVmManagerImpl.java:2905)
>>>> >>>>>> >>>>> at
>>>> >>>>>> >>>>>
>>>> >>>>>> >>>>>
>>>> com.cloud.utils.component.ComponentInstantiationPostProcessor$InterceptorDispatcher.intercept(ComponentInstantiationPostProcessor.java:125)
>>>> >>>>>> >>>>> at
>>>> >>>>>> >>>>>
>>>> >>>>>> >>>>>
>>>> org.apache.cloudstack.api.command.user.vm.DeployVMCmd.execute(DeployVMCmd.java:421)
>>>> >>>>>> >>>>> at
>>>> com.cloud.api.ApiDispatcher.dispatch(ApiDispatcher.java:161)
>>>> >>>>>> >>>>> at
>>>> >>>>>> >>>>>
>>>> >>>>>> >>>>>
>>>> com.cloud.api.ApiAsyncJobDispatcher.runJobInContext(ApiAsyncJobDispatcher.java:109)
>>>> >>>>>> >>>>> at
>>>> >>>>>> >>>>>
>>>> >>>>>> >>>>>
>>>> com.cloud.api.ApiAsyncJobDispatcher$1.run(ApiAsyncJobDispatcher.java:66)
>>>> >>>>>> >>>>> at
>>>> >>>>>> >>>>>
>>>> >>>>>> >>>>>
>>>> org.apache.cloudstack.managed.context.impl.DefaultManagedContext$1.call(DefaultManagedContext.java:56)
>>>> >>>>>> >>>>> at
>>>> >>>>>> >>>>>
>>>> >>>>>> >>>>>
>>>> org.apache.cloudstack.managed.context.impl.DefaultManagedContext.callWithContext(DefaultManagedContext.java:103)
>>>> >>>>>> >>>>> at
>>>> >>>>>> >>>>>
>>>> >>>>>> >>>>>
>>>> org.apache.cloudstack.managed.context.impl.DefaultManagedContext.runWithContext(DefaultManagedContext.java:53)
>>>> >>>>>> >>>>> at
>>>> >>>>>> >>>>>
>>>> >>>>>> >>>>>
>>>> com.cloud.api.ApiAsyncJobDispatcher.runJob(ApiAsyncJobDispatcher.java:63)
>>>> >>>>>> >>>>> at
>>>> >>>>>> >>>>>
>>>> >>>>>> >>>>>
>>>> org.apache.cloudstack.framework.jobs.impl.AsyncJobManagerImpl$1.runInContext(AsyncJobManagerImpl.java:532)
>>>> >>>>>> >>>>> at
>>>> >>>>>> >>>>>
>>>> >>>>>> >>>>>
>>>> org.apache.cloudstack.managed.context.ManagedContextRunnable$1.run(ManagedContextRunnable.java:49)
>>>> >>>>>> >>>>> at
>>>> >>>>>> >>>>>
>>>> >>>>>> >>>>>
>>>> org.apache.cloudstack.managed.context.impl.DefaultManagedContext$1.call(DefaultManagedContext.java:56)
>>>> >>>>>> >>>>> at
>>>> >>>>>> >>>>>
>>>> >>>>>> >>>>>
>>>> org.apache.cloudstack.managed.context.impl.DefaultManagedContext.callWithContext(DefaultManagedContext.java:103)
>>>> >>>>>> >>>>> at
>>>> >>>>>> >>>>>
>>>> >>>>>> >>>>>
>>>> org.apache.cloudstack.managed.context.impl.DefaultManagedContext.runWithContext(DefaultManagedContext.java:53)
>>>> >>>>>> >>>>> at
>>>> >>>>>> >>>>>
>>>> >>>>>> >>>>>
>>>> org.apache.cloudstack.managed.context.ManagedContextRunnable.run(ManagedContextRunnable.java:46)
>>>> >>>>>> >>>>> at
>>>> >>>>>> >>>>>
>>>> >>>>>> >>>>>
>>>> java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:471)
>>>> >>>>>> >>>>> at java.util.concurrent.FutureTask.run(FutureTask.java:262)
>>>> >>>>>> >>>>> at
>>>> >>>>>> >>>>>
>>>> >>>>>> >>>>>
>>>> java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
>>>> >>>>>> >>>>> at
>>>> >>>>>> >>>>>
>>>> >>>>>> >>>>>
>>>> java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
>>>> >>>>>> >>>>> at java.lang.Thread.run(Thread.java:724)
>>>> >>>>>> >>>>>
>>>> >>>>>> >>>>> Thanks!
>>>> >>>>>> >>>
>>>> >>>>>> >>>
>>>> >>>>>> >>>
>>>> >>>>>> >>>
>>>> >>>>>> >>> --
>>>> >>>>>> >>> Mike Tutkowski
>>>> >>>>>> >>> Senior CloudStack Developer, SolidFire
Inc.
>>>> >>>>>> >>> e: mike.tutkowski@solidfire.com
>>>> >>>>>> >>> o: 303.746.7302
>>>> >>>>>> >>> Advancing the way the world uses the
cloud™
>>>> >>>>>> >>
>>>> >>>>>> >>
>>>> >>>>>> >>
>>>> >>>>>> >>
>>>> >>>>>> >> --
>>>> >>>>>> >> Mike Tutkowski
>>>> >>>>>> >> Senior CloudStack Developer, SolidFire
Inc.
>>>> >>>>>> >> e: mike.tutkowski@solidfire.com
>>>> >>>>>> >> o: 303.746.7302
>>>> >>>>>> >> Advancing the way the world uses the cloud™
>>>> >>>>>> >
>>>> >>>>>> >
>>>> >>>>>> >
>>>> >>>>>> >
>>>> >>>>>> > --
>>>> >>>>>> > Mike Tutkowski
>>>> >>>>>> > Senior CloudStack Developer, SolidFire Inc.
>>>> >>>>>> > e: mike.tutkowski@solidfire.com
>>>> >>>>>> > o: 303.746.7302
>>>> >>>>>> > Advancing the way the world uses the cloud™
>>>> >>>>>
>>>> >>>>>
>>>> >>>>>
>>>> >>>>>
>>>> >>>>> --
>>>> >>>>> Mike Tutkowski
>>>> >>>>> Senior CloudStack Developer, SolidFire Inc.
>>>> >>>>> e: mike.tutkowski@solidfire.com
>>>> >>>>> o: 303.746.7302
>>>> >>>>> Advancing the way the world uses the cloud™
>>>> >>>>
>>>> >>>>
>>>> >>>>
>>>> >>>>
>>>> >>>> --
>>>> >>>> Mike Tutkowski
>>>> >>>> Senior CloudStack Developer, SolidFire Inc.
>>>> >>>> e: mike.tutkowski@solidfire.com
>>>> >>>> o: 303.746.7302
>>>> >>>> Advancing the way the world uses the cloud™
>>>> >>>
>>>> >>>
>>>> >>>
>>>> >>>
>>>> >>> --
>>>> >>> Mike Tutkowski
>>>> >>> Senior CloudStack Developer, SolidFire Inc.
>>>> >>> e: mike.tutkowski@solidfire.com
>>>> >>> o: 303.746.7302
>>>> >>> Advancing the way the world uses the cloud™
>>>> >
>>>> >
>>>> >
>>>> >
>>>> > --
>>>> > Mike Tutkowski
>>>> > Senior CloudStack Developer, SolidFire Inc.
>>>> > e: mike.tutkowski@solidfire.com
>>>> > o: 303.746.7302
>>>> > Advancing the way the world uses the cloud™
>>>>
>>>
>>>
>>>
>>> --
>>> *Mike Tutkowski*
>>> *Senior CloudStack Developer, SolidFire Inc.*
>>> e: mike.tutkowski@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.tutkowski@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.tutkowski@solidfire.com
o: 303.746.7302
Advancing the way the world uses the
cloud<http://solidfire.com/solution/overview/?video=play>
*™*

Mime
  • Unnamed multipart/alternative (inline, None, 0 bytes)
View raw message