func (s *storageAttachmentInfoSuite) TestStorageAttachmentInfoMissingBlockDevice(c *gc.C) { // If the block device has not shown up yet, // then we should get a NotProvisioned error. s.blockDevices = nil s.volumeAttachment.info.DeviceName = "sda" _, err := storagecommon.StorageAttachmentInfo(s.st, s.storageAttachment, s.machineTag) c.Assert(err, jc.Satisfies, errors.IsNotProvisioned) s.st.CheckCallNames(c, "StorageInstance", "StorageInstanceVolume", "VolumeAttachment", "BlockDevices") }
func (s *storageAttachmentInfoSuite) TestStorageAttachmentInfoNoBlockDevice(c *gc.C) { // Neither the volume nor the volume attachment has enough information // to persistently identify the path, so we must enquire about block // devices; there are none (yet), so NotProvisioned is returned. s.volumeAttachment.info.BusAddress = "scsi@1:2.3.4" _, err := storagecommon.StorageAttachmentInfo(s.st, s.storageAttachment, s.machineTag) c.Assert(err, jc.Satisfies, errors.IsNotProvisioned) s.st.CheckCallNames(c, "StorageInstance", "StorageInstanceVolume", "VolumeAttachment", "BlockDevices") }
func (s *storageAttachmentInfoSuite) TestStorageAttachmentInfoPersistentDeviceLink(c *gc.C) { s.volumeAttachment.info.DeviceLink = "/dev/disk/by-id/verbatim" info, err := storagecommon.StorageAttachmentInfo(s.st, s.storageAttachment, s.machineTag) c.Assert(err, jc.ErrorIsNil) s.st.CheckCallNames(c, "StorageInstance", "StorageInstanceVolume", "VolumeAttachment", "BlockDevices") c.Assert(info, jc.DeepEquals, &storage.StorageAttachmentInfo{ Kind: storage.StorageKindBlock, Location: "/dev/disk/by-id/verbatim", }) }
func (s *storageAttachmentInfoSuite) TestStorageAttachmentInfoPersistentDeviceName(c *gc.C) { s.volumeAttachment.info.DeviceName = "sda" info, err := storagecommon.StorageAttachmentInfo(s.st, s.storageAttachment, s.machineTag) c.Assert(err, jc.ErrorIsNil) s.st.CheckCallNames(c, "StorageInstance", "StorageInstanceVolume", "VolumeAttachment", "BlockDevices") c.Assert(info, jc.DeepEquals, &storage.StorageAttachmentInfo{ Kind: storage.StorageKindBlock, Location: filepath.FromSlash("/dev/sda"), }) }
func storageAttachmentInfo(st storageAccess, a state.StorageAttachment) (_ names.MachineTag, location string, _ error) { machineTag, err := st.UnitAssignedMachine(a.Unit()) if errors.IsNotAssigned(err) { return names.MachineTag{}, "", nil } else if err != nil { return names.MachineTag{}, "", errors.Trace(err) } info, err := storagecommon.StorageAttachmentInfo(st, a, machineTag) if errors.IsNotProvisioned(err) { return machineTag, "", nil } else if err != nil { return names.MachineTag{}, "", errors.Trace(err) } return machineTag, info.Location, nil }
func (s *storageAttachmentInfoSuite) TestStorageAttachmentInfoMatchingBlockDevice(c *gc.C) { // The bus address alone is not enough to produce a path to the block // device; we need to find a published block device with the matching // bus address. s.volumeAttachment.info.BusAddress = "scsi@1:2.3.4" s.blockDevices = []state.BlockDeviceInfo{{ DeviceName: "sda", }, { DeviceName: "sdb", BusAddress: s.volumeAttachment.info.BusAddress, }} info, err := storagecommon.StorageAttachmentInfo(s.st, s.storageAttachment, s.machineTag) c.Assert(err, jc.ErrorIsNil) s.st.CheckCallNames(c, "StorageInstance", "StorageInstanceVolume", "VolumeAttachment", "BlockDevices") c.Assert(info, jc.DeepEquals, &storage.StorageAttachmentInfo{ Kind: storage.StorageKindBlock, Location: filepath.FromSlash("/dev/sdb"), }) }
func (s *StorageAPI) fromStateStorageAttachment(stateStorageAttachment state.StorageAttachment) (params.StorageAttachment, error) { machineTag, err := s.st.UnitAssignedMachine(stateStorageAttachment.Unit()) if err != nil { return params.StorageAttachment{}, err } info, err := storagecommon.StorageAttachmentInfo(s.st, stateStorageAttachment, machineTag) if err != nil { return params.StorageAttachment{}, err } stateStorageInstance, err := s.st.StorageInstance(stateStorageAttachment.StorageInstance()) if err != nil { return params.StorageAttachment{}, err } return params.StorageAttachment{ stateStorageAttachment.StorageInstance().String(), stateStorageInstance.Owner().String(), stateStorageAttachment.Unit().String(), params.StorageKind(stateStorageInstance.Kind()), info.Location, params.Life(stateStorageAttachment.Life().String()), }, nil }