func (a *API) convertStateVolumeToParams(st state.Volume) (params.VolumeInstance, error) { volume := params.VolumeInstance{VolumeTag: st.VolumeTag().String()} if storage, err := st.StorageInstance(); err == nil { volume.StorageTag = storage.String() storageInstance, err := a.storage.StorageInstance(storage) if err != nil { err = errors.Annotatef(err, "getting storage instance %v for volume %v", storage, volume.VolumeTag) return params.VolumeInstance{}, err } owner := storageInstance.Owner() // only interested in Unit for now if unitTag, ok := owner.(names.UnitTag); ok { volume.UnitTag = unitTag.String() } } if info, err := st.Info(); err == nil { volume.HardwareId = info.HardwareId volume.Size = info.Size volume.Persistent = info.Persistent volume.VolumeId = info.VolumeId } status, err := st.Status() if err != nil { return params.VolumeInstance{}, errors.Trace(err) } volume.Status = common.EntityStatusFromState(status) return volume, nil }
// VolumeFromState converts a state.Volume to params.Volume. func VolumeFromState(v state.Volume) (params.Volume, error) { info, err := v.Info() if err != nil { return params.Volume{}, errors.Trace(err) } return params.Volume{ v.VolumeTag().String(), VolumeInfoFromState(info), }, nil }
// VolumeFromState converts a state.Volume to params.Volume. func VolumeFromState(v state.Volume) (params.Volume, error) { info, err := v.Info() if err != nil { return params.Volume{}, errors.Trace(err) } return params.Volume{ v.VolumeTag().String(), params.VolumeInfo{ info.VolumeId, info.HardwareId, info.Size, info.Persistent, }, }, nil }
func createVolumeDetails( st storageAccess, v state.Volume, attachments []state.VolumeAttachment, ) (*params.VolumeDetails, error) { details := ¶ms.VolumeDetails{ VolumeTag: v.VolumeTag().String(), } if info, err := v.Info(); err == nil { details.Info = storagecommon.VolumeInfoFromState(info) } if len(attachments) > 0 { details.MachineAttachments = make(map[string]params.VolumeAttachmentInfo, len(attachments)) for _, attachment := range attachments { stateInfo, err := attachment.Info() var info params.VolumeAttachmentInfo if err == nil { info = storagecommon.VolumeAttachmentInfoFromState(stateInfo) } details.MachineAttachments[attachment.Machine().String()] = info } } status, err := v.Status() if err != nil { return nil, errors.Trace(err) } details.Status = common.EntityStatusFromState(status) if storageTag, err := v.StorageInstance(); err == nil { storageInstance, err := st.StorageInstance(storageTag) if err != nil { return nil, errors.Trace(err) } storageDetails, err := createStorageDetails(st, storageInstance) if err != nil { return nil, errors.Trace(err) } details.Storage = storageDetails } return details, nil }
// VolumeParams returns the parameters for creating or destroying // the given volume. func VolumeParams( v state.Volume, storageInstance state.StorageInstance, modelUUID, controllerUUID string, environConfig *config.Config, poolManager poolmanager.PoolManager, registry storage.ProviderRegistry, ) (params.VolumeParams, error) { var pool string var size uint64 if stateVolumeParams, ok := v.Params(); ok { pool = stateVolumeParams.Pool size = stateVolumeParams.Size } else { volumeInfo, err := v.Info() if err != nil { return params.VolumeParams{}, errors.Trace(err) } pool = volumeInfo.Pool size = volumeInfo.Size } volumeTags, err := storageTags(storageInstance, modelUUID, controllerUUID, environConfig) if err != nil { return params.VolumeParams{}, errors.Annotate(err, "computing storage tags") } providerType, cfg, err := StoragePoolConfig(pool, poolManager, registry) if err != nil { return params.VolumeParams{}, errors.Trace(err) } return params.VolumeParams{ v.Tag().String(), size, string(providerType), cfg.Attrs(), volumeTags, nil, // attachment params set by the caller }, nil }