// appendMatchingImages updates matchingImages with image metadata records from images which belong to the // specified region. If an image already exists in matchingImages, it is not overwritten. func appendMatchingImages(source simplestreams.DataSource, matchingImages []interface{}, images map[string]interface{}, cons simplestreams.LookupConstraint) ([]interface{}, error) { imagesMap := make(map[imageKey]*ImageMetadata, len(matchingImages)) for _, val := range matchingImages { im := val.(*ImageMetadata) imagesMap[imageKey{im.VirtType, im.Arch, im.Version, im.RegionName, im.Storage}] = im } for _, val := range images { im := val.(*ImageMetadata) if cons != nil && cons.Params().Region != "" && cons.Params().Region != im.RegionName { continue } if _, ok := imagesMap[imageKey{im.VirtType, im.Arch, im.Version, im.RegionName, im.Storage}]; !ok { matchingImages = append(matchingImages, im) } } return matchingImages, nil }
// appendMatchingTools updates matchingTools with tools metadata records from tools which belong to the // specified series. If a tools record already exists in matchingTools, it is not overwritten. func appendMatchingTools(source simplestreams.DataSource, matchingTools []interface{}, tools map[string]interface{}, cons simplestreams.LookupConstraint) ([]interface{}, error) { toolsMap := make(map[version.Binary]*ToolsMetadata, len(matchingTools)) for _, val := range matchingTools { tm := val.(*ToolsMetadata) binary, err := tm.binary() if err != nil { return nil, errors.Trace(err) } toolsMap[binary] = tm } for _, val := range tools { tm := val.(*ToolsMetadata) if !set.NewStrings(cons.Params().Series...).Contains(tm.Release) { continue } if toolsConstraint, ok := cons.(*ToolsConstraint); ok { tmNumber := version.MustParse(tm.Version) if toolsConstraint.Version == version.Zero { if toolsConstraint.MajorVersion >= 0 && toolsConstraint.MajorVersion != tmNumber.Major { continue } if toolsConstraint.MinorVersion >= 0 && toolsConstraint.MinorVersion != tmNumber.Minor { continue } } else { if toolsConstraint.Version != tmNumber { continue } } } binary, err := tm.binary() if err != nil { return nil, errors.Trace(err) } if _, ok := toolsMap[binary]; !ok { tm.FullPath, _ = source.URL(tm.Path) matchingTools = append(matchingTools, tm) } } return matchingTools, nil }