// helper function to get site content. Return either list of blocks or datasets on site. func siteContent(siteName, tstamp, recType string) []string { api := "blockreplicasummary" if strings.HasPrefix(siteName, "T1_") && !strings.HasSuffix(siteName, "_Disk") { siteName += "_Disk" } furl := fmt.Sprintf("%s/%s?node=%s&create_since=%d", phedexUrl(), api, siteName, utils.UnixTime(tstamp)) if utils.VERBOSE > 1 { fmt.Println("furl", furl) } response := utils.FetchResponse(furl, "") // use a map to collect dataset names as keys ddict := make(Record) if response.Error == nil { records := loadPhedexData(furl, response.Data) for _, rec := range records { val := rec["phedex"].(map[string]interface{}) blocks := val["block"].([]interface{}) for _, item := range blocks { brec := item.(map[string]interface{}) blk := brec["name"].(string) if recType == "block" { ddict[blk] = struct{}{} } else { // look-up dataset name dataset := strings.Split(blk, "#")[0] if datasetNameOk(dataset) { ddict[dataset] = struct{}{} } } } } // return map keys, they're unique already return utils.MapKeys(ddict) } return []string{} }
// helper function to format aggregated breakdown results func formatBreakdown(bdown Record, breakdown string) string { report := "" if breakdown == "" { return report } keys := utils.MapKeys(bdown) lsize := 0 if breakdown == "tier" { sort.Sort(utils.StringList(keys)) for _, k := range keys { if len(k) > lsize { lsize = len(k) } } } for _, k := range keys { v := bdown[k] size := v.(float64) pad := "" if breakdown == "tier" { if len(k) < lsize { pad = strings.Repeat(" ", (lsize - len(k))) } } report += fmt.Sprintf(" %s%s\t%f (%s)\n", k, pad, size, utils.SizeFormat(size)) } return report }