예제 #1
0
def wait_for_component_toplevel_file(context, package, version, ecosystem,
                                     bucket):
    """Wait for the component analysis to finish.

    This function tries to wait for the finish of component (package) analysis by repeatedly
    reading the 'LastModified' attribute from the {ecosystem}/{package}/{version}.json bucket
    from the bayesian-core-data.
    If this attribute is newer than remembered timestamp, the analysis is perceived as done.
    """
    timeout = 300 * 60
    sleep_amount = 10

    key = S3Interface.component_key(ecosystem, package, version)

    start_time = datetime.datetime.now(datetime.timezone.utc)

    for _ in range(timeout // sleep_amount):
        current_date = datetime.datetime.now(datetime.timezone.utc)
        try:
            last_modified = context.s3interface.read_object_metadata(
                bucket, key, "LastModified")
            delta = current_date - last_modified
            # print(current_date, "   ", last_modified, "   ", delta)
            if delta.days == 0 and delta.seconds < sleep_amount * 2:
                # print("done!")
                read_core_data_from_bucket(context, "component toplevel",
                                           package, version, ecosystem, bucket)
                return
        except ClientError:
            print("No analyses yet (waiting for {t})".format(t=current_date -
                                                             start_time))
        time.sleep(sleep_amount)
    raise Exception('Timeout waiting for the job metadata in S3!')
예제 #2
0
def read_core_data_from_bucket(context, selector, package, version, ecosystem,
                               bucket):
    """Read the component toplevel metadata."""
    if selector == "component toplevel":
        key = S3Interface.component_key(ecosystem, package, version)
    else:
        metadata = S3Interface.selector_to_key(selector)
        key = S3Interface.component_analysis_key(ecosystem, package, version,
                                                 metadata)

    try:
        s3_data = context.s3interface.read_object(bucket, key)
        assert s3_data is not None
        context.s3_data = s3_data
    except Exception as e:
        m = "Can not read {key} for the E/P/V {ecosystem} {package} {version} from bucket {bucket}"\
            .format(key=key, ecosystem=ecosystem, package=package, version=version, bucket=bucket)
        context.s3_data = None
        raise Exception(m) from e