// APIResult2ServiceResources converts a ResourcesResult into a resource.ServiceResources. func APIResult2ServiceResources(apiResult ResourcesResult) (resource.ServiceResources, error) { var result resource.ServiceResources if apiResult.Error != nil { // TODO(ericsnow) Return the resources too? err := common.RestoreError(apiResult.Error) return resource.ServiceResources{}, errors.Trace(err) } for _, apiRes := range apiResult.Resources { res, err := API2Resource(apiRes) if err != nil { // This could happen if the server is misbehaving // or non-conforming. // TODO(ericsnow) Aggregate errors? return resource.ServiceResources{}, errors.Annotate(err, "got bad data from server") } result.Resources = append(result.Resources, res) } for _, unitRes := range apiResult.UnitResources { tag, err := names.ParseUnitTag(unitRes.Tag) if err != nil { return resource.ServiceResources{}, errors.Annotate(err, "got bad data from server") } resNames := map[string]bool{} unitResources := resource.UnitResources{Tag: tag} for _, apiRes := range unitRes.Resources { res, err := API2Resource(apiRes) if err != nil { return resource.ServiceResources{}, errors.Annotate(err, "got bad data from server") } resNames[res.Name] = true unitResources.Resources = append(unitResources.Resources, res) } if len(unitRes.DownloadProgress) > 0 { unitResources.DownloadProgress = make(map[string]int64) for resName, progress := range unitRes.DownloadProgress { if _, ok := resNames[resName]; !ok { err := errors.Errorf("got progress from unrecognized resource %q", resName) return resource.ServiceResources{}, errors.Annotate(err, "got bad data from server") } unitResources.DownloadProgress[resName] = progress } } result.UnitResources = append(result.UnitResources, unitResources) } for _, chRes := range apiResult.CharmStoreResources { res, err := API2CharmResource(chRes) if err != nil { return resource.ServiceResources{}, errors.Annotate(err, "got bad data from server") } result.CharmStoreResources = append(result.CharmStoreResources, res) } return result, nil }
// APIResult2ServiceResources converts a ResourcesResult into a resource.ServiceResources. func APIResult2ServiceResources(apiResult ResourcesResult) (resource.ServiceResources, error) { var result resource.ServiceResources if apiResult.Error != nil { // TODO(ericsnow) Return the resources too? err, _ := common.RestoreError(apiResult.Error) return resource.ServiceResources{}, errors.Trace(err) } for _, apiRes := range apiResult.Resources { res, err := API2Resource(apiRes) if err != nil { // This could happen if the server is misbehaving // or non-conforming. // TODO(ericsnow) Aggregate errors? return resource.ServiceResources{}, errors.Annotate(err, "got bad data from server") } result.Resources = append(result.Resources, res) } for _, unitRes := range apiResult.UnitResources { tag, err := names.ParseUnitTag(unitRes.Tag) if err != nil { return resource.ServiceResources{}, errors.Annotate(err, "got bad data from server") } unitResources := resource.UnitResources{Tag: tag} for _, apiRes := range unitRes.Resources { res, err := API2Resource(apiRes) if err != nil { return resource.ServiceResources{}, errors.Annotate(err, "got bad data from server") } unitResources.Resources = append(unitResources.Resources, res) } result.UnitResources = append(result.UnitResources, unitResources) } return result, nil }