func (api *API) createParamsStorageAttachment(si params.StorageDetails, sa state.StorageAttachment) (params.StorageDetails, error) { result := params.StorageDetails{Status: "pending"} result.StorageTag = sa.StorageInstance().String() if result.StorageTag != si.StorageTag { panic("attachment does not belong to storage instance") } result.UnitTag = sa.Unit().String() result.OwnerTag = si.OwnerTag result.Kind = si.Kind result.Persistent = si.Persistent // TODO(axw) set status according to whether storage has been provisioned. // This is only for provisioned attachments machineTag, err := api.storage.UnitAssignedMachine(sa.Unit()) if err != nil { return params.StorageDetails{}, errors.Annotate(err, "getting unit for storage attachment") } info, err := common.StorageAttachmentInfo(api.storage, sa, machineTag) if err != nil { if errors.IsNotProvisioned(err) { // If Info returns an error, then the storage has not yet been provisioned. return result, nil } return params.StorageDetails{}, errors.Annotate(err, "getting storage attachment info") } result.Location = info.Location if result.Location != "" { result.Status = "attached" } return result, nil }
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 := common.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 }