$agg_urn = $agg[SR_TABLE_FIELDNAME::SERVICE_URN];
        if ($agg_urn == $slice_agg_urn) {
            $agg_url = $agg[SR_TABLE_FIELDNAME::SERVICE_URL];
            $all_slice_aggs[$agg_urn] = $agg_url;
            break;
        }
    }
}
// error_log("SLICE_AGGS = " . print_r($all_slice_aggs, true));
// Get the manifests for this slice at each aggregate in the sliver info
$manifests = array();
foreach ($all_slice_aggs as $agg_urn => $agg_url) {
    //  error_log("URN " . $agg_urn . " URL " . $agg_url);
    $slice_cred = get_slice_credential($sa_url, $user, $slice_id);
    //  error_log("SC = " . $slice_cred);
    $raw_output = list_resources_on_slice($agg_url, $user, $slice_cred, $slice_urn);
    if (is_null($raw_output)) {
        error_log("Null result from listresources at " . $agg_url . " on " . $slice_urn);
    } else {
        if (!is_array($raw_output)) {
            error_log("Error result from listresources at " . $agg_url . " on " . $slice_urn . ": '" . $raw_output . "'.");
        } else {
            $output = $raw_output[1][$agg_url];
            //  error_log("OUTPUT = " . print_r($output, true));
            if (array_key_exists('code', $output) && array_key_exists('value', $output) && array_key_exists('geni_code', $output['code']) && $output['code']['geni_code'] == 0) {
                $manifest = $output['value'];
                $manifests[$agg_urn] = $manifest;
            }
        }
    }
}
function query_details($user, $ams, $sa_url, $slice, $slice_id)
{
    // Takes an arg am_id which may have multiple values. Each is treated
    // as the ID from the DB of an AM which should be queried
    // If no such arg is given, then query the DB and query all registered AMs
    if (!isset($ams) || is_null($ams) || count($ams) <= 0) {
        // Didnt get an array of AMs
        if (!isset($am) || is_null($am)) {
            // Nor a single am
            $ams = get_services_of_type(SR_SERVICE_TYPE::AGGREGATE_MANAGER);
        } else {
            $ams = array();
            $ams[] = $am;
        }
    }
    if (!isset($ams) || is_null($ams) || count($ams) <= 0) {
        error_log("Found no AMs for query-details!");
        $slivers_output = "No AMs registered.";
    }
    if (convert_boolean($slice['expired'])) {
        $msg = "Slice is expired";
        $good = false;
        $obj = array();
    } else {
        $slivers_output = "";
        // Get the slice credential from the SA
        $slice_credential = get_slice_credential($sa_url, $user, $slice_id);
        // Get the slice URN via the SA
        $slice_urn = $slice[SA_ARGUMENT::SLICE_URN];
        $am_urls = array();
        foreach ($ams as $am) {
            if (is_array($am)) {
                if (array_key_exists(SR_TABLE_FIELDNAME::SERVICE_URL, $am)) {
                    $am_url = $am[SR_TABLE_FIELDNAME::SERVICE_URL];
                } else {
                    error_log("Malformed array of AM URLs?");
                    continue;
                }
            } else {
                $am_url = $am;
            }
            $am_urls[] = $am_url;
        }
        $retVal = list_resources_on_slice($am_urls, $user, $slice_credential, $slice_urn);
        $good = FALSE;
        if (!is_null($retVal) && count($retVal) == 2) {
            $msg = $retVal[0];
            $obj = $retVal[1];
            $good = TRUE;
        } elseif (count($retVal) == 1) {
            $msg = $retVal;
            $obj[$am_url] = "";
        } else {
            $msg = "Call to list_resources_on_slice() FAILed";
            $obj = array();
        }
    }
    $retVal2 = array();
    $retVal2[] = $msg;
    $retVal2[] = $obj;
    $retVal2[] = $good;
    return $retVal2;
}