def get_subscription(subscriptionId):
    """
    GET /subscriptions/<subscriptionId>
    :return: list of subscription objects serialized into json
    """

    request_inputs = anchore_engine.services.common.do_request_prep(
        request, default_params={})
    user_auth = request_inputs['auth']
    params = request_inputs['params']
    return_object = []
    httpcode = 500
    userId, pw = user_auth

    try:
        subscription_records = catalog.get_subscription(
            user_auth, subscription_id=subscriptionId)
        for subscription_record in subscription_records:
            return_object.append(
                make_response_subscription(user_auth, subscription_record,
                                           params))
        httpcode = 200
    except Exception as err:
        return_object = anchore_engine.services.common.make_response_error(
            err, in_httpcode=httpcode)
        httpcode = return_object['httpcode']

    return (return_object, httpcode)
Example #2
0
def list_subscriptions(subscription_key=None, subscription_type=None):
    """
    GET /subscriptions
    :return: list of subscription objects serialized into json
    """

    request_inputs = anchore_engine.services.common.do_request_prep(request, default_params={'subscription_key': subscription_key, 'subscription_type': subscription_type})
    user_auth = request_inputs['auth']
    method = request_inputs['method']
    bodycontent = request_inputs['bodycontent']
    params = request_inputs['params']

    return_object = []
    httpcode = 500
    userId, pw = user_auth

    try:
        subscription_records = catalog.get_subscription(user_auth, subscription_key=subscription_key, subscription_type=subscription_type)
        for subscription_record in subscription_records:
            return_object.append(make_response_subscription(user_auth, subscription_record, params))
        httpcode = 200
    except Exception as err:
        return_object = anchore_engine.services.common.make_response_error(err, in_httpcode=httpcode)
        httpcode = return_object['httpcode']

    return (return_object, httpcode)
Example #3
0
def images(request_inputs):
    user_auth = request_inputs['auth']
    method = request_inputs['method']
    bodycontent = request_inputs['bodycontent']
    params = request_inputs['params']

    return_object = {}
    httpcode = 500

    userId, pw = user_auth
    digest = tag = imageId = imageDigest = dockerfile = None

    history = False
    if params and 'history' in params:
        history = params['history']

    force = False
    if params and 'force' in params:
        force = params['force']

    if bodycontent:
        jsondata = json.loads(bodycontent)

        if 'digest' in jsondata:
            digest = jsondata['digest']
        elif 'tag' in jsondata:
            tag = jsondata['tag']
        elif 'imageDigest' in jsondata:
            imageDigest = jsondata['imageDigest']
        elif 'imageId' in jsondata:
            imageId = jsondata['imageId']

        if 'dockerfile' in jsondata:
            dockerfile = jsondata['dockerfile']

    try:
        if method == 'GET':
            logger.debug("handling GET: ")
            try:
                return_object = []
                image_records = catalog.get_image(user_auth, digest=digest, tag=tag, imageId=imageId,
                                                          imageDigest=imageDigest, history=history)
                for image_record in image_records:
                    return_object.append(make_response_image(user_auth, image_record, params))
                httpcode = 200
            except Exception as err:
                raise err

        elif method == 'POST':
            logger.debug("handling POST: ")

            # if not, add it and set it up to be analyzed
            if not tag:
                # dont support digest add, yet
                httpcode = 500
                raise Exception("digest add unsupported")

            # add the image to the catalog
            image_record = catalog.add_image(user_auth, tag=tag, dockerfile=dockerfile)
            imageDigest = image_record['imageDigest']

            # finally, do any state updates and return
            if image_record:
                #logger.debug("fetched image_info: " + json.dumps(image_record, indent=4))
                logger.debug("added image: " + str(imageDigest))

                # auto-subscribe for NOW
                for image_detail in image_record['image_detail']:
                    fulltag = image_detail['registry'] + "/" + image_detail['repo'] + ":" + image_detail['tag']

                    foundtypes = []
                    try:
                        subscription_records = catalog.get_subscription(user_auth, subscription_key=fulltag)
                        for subscription_record in subscription_records:
                            if subscription_record['subscription_key'] == fulltag:
                                foundtypes.append(subscription_record['subscription_type'])
                    except Exception as err:
                        logger.warn("cannot load subscription records - exception: " + str(err))

                    sub_types = anchore_engine.services.common.subscription_types
                    for sub_type in sub_types:
                        if sub_type in ['repo_update']:
                            continue
                        if sub_type not in foundtypes:
                            try:
                                default_active = False
                                if sub_type in ['tag_update']:
                                    default_active = True
                                catalog.add_subscription(user_auth, {'active': default_active, 'subscription_type': sub_type, 'subscription_key': fulltag})
                            except:
                                try:
                                    catalog.update_subscription(user_auth, {'subscription_type': sub_type, 'subscription_key': fulltag})
                                except:
                                    pass

                # set the state of the image appropriately
                currstate = image_record['analysis_status']
                if not currstate:
                    newstate = taskstate.init_state('analyze', None)
                elif force or currstate == taskstate.fault_state('analyze'):
                    newstate = taskstate.reset_state('analyze')
                elif image_record['image_status'] == 'deleted':
                    newstate = taskstate.reset_state('analyze')
                else:
                    newstate = currstate

                if (currstate != newstate) or (force):
                    logger.debug("state change detected: " + str(currstate) + " : " + str(newstate))
                    image_record.update({'image_status': 'active', 'analysis_status': newstate})
                    updated_image_record = catalog.update_image(user_auth, imageDigest, image_record)
                    if updated_image_record:
                        image_record = updated_image_record[0]
                else:
                    logger.debug("no state change detected: " + str(currstate) + " : " + str(newstate))

                httpcode = 200
                return_object = [make_response_image(user_auth, image_record, params)]
            else:
                httpcode = 500
                raise Exception("failed to add image")

    except Exception as err:
        logger.debug("operation exception: " + str(err))
        return_object = anchore_engine.services.common.make_response_error(err, in_httpcode=httpcode)
        httpcode = return_object['httpcode']

    return (return_object, httpcode)
Example #4
0
def images(request_inputs):
    user_auth = request_inputs['auth']
    method = request_inputs['method']
    bodycontent = request_inputs['bodycontent']
    params = request_inputs['params']

    return_object = {}
    httpcode = 500

    userId, pw = user_auth
    fulltag = digest = tag = imageId = imageDigest = dockerfile = annotations = None

    history = False
    force = False
    autosubscribe = True
    query_fulltag = None

    if params:
        if 'history' in params:
            history = params['history']

        if 'force' in params:
            force = params['force']

        if 'autosubscribe' in params:
            autosubscribe = params['autosubscribe']

        if 'fulltag' in params:
            query_fulltag = params['fulltag']

    if bodycontent:
        jsondata = json.loads(bodycontent)

        if 'digest' in jsondata:
            digest = jsondata['digest']

        if 'tag' in jsondata:
            tag = jsondata['tag']
        #elif 'imageDigest' in jsondata:
        #    imageDigest = jsondata['imageDigest']
        #elif 'imageId' in jsondata:
        #    imageId = jsondata['imageId']

        if 'dockerfile' in jsondata:
            dockerfile = jsondata['dockerfile']

        if 'annotations' in jsondata:
            annotations = jsondata['annotations']

        autosubscribes = ['analysis_update']
        if autosubscribe:
            autosubscribes.append("tag_update")

    try:
        if method == 'GET':
            logger.debug("handling GET: ")
            try:
                return_object = []

                # Query param fulltag has precedence for search
                if query_fulltag:
                    tag = query_fulltag
                    imageId = imageDigest = digest = None

                image_records = catalog.get_image(user_auth,
                                                  digest=digest,
                                                  tag=tag,
                                                  imageId=imageId,
                                                  imageDigest=imageDigest,
                                                  history=history)
                for image_record in image_records:
                    return_object.append(
                        make_response_image(user_auth, image_record, params))
                httpcode = 200
            except Exception as err:
                raise err

        elif method == 'POST':
            logger.debug(
                "handling POST: input_tag={} input_digest={} input_force={}".
                format(tag, digest, force))
            # if not, add it and set it up to be analyzed
            if not tag:
                # dont support digest add, yet
                httpcode = 400
                raise Exception("tag is required for image add")

            if digest and tag:
                if not force:
                    httpcode = 400
                    raise Exception("force is required to add digest+tag")
                else:
                    try:
                        image_check = catalog.get_image(user_auth,
                                                        digest=digest,
                                                        tag=tag,
                                                        imageId=None,
                                                        imageDigest=digest,
                                                        history=False)
                    except Exception as err:
                        httpcode = 400
                        raise Exception(
                            "image digest must already exist to force re-analyze using tag+digest"
                        )

            # add the image to the catalog
            image_record = catalog.add_image(user_auth,
                                             tag=tag,
                                             digest=digest,
                                             dockerfile=dockerfile,
                                             annotations=annotations)
            imageDigest = image_record['imageDigest']

            # finally, do any state updates and return
            if image_record:
                logger.debug("added image: " + str(imageDigest))

                # auto-subscribe for NOW
                for image_detail in image_record['image_detail']:
                    fulltag = image_detail['registry'] + "/" + image_detail[
                        'repo'] + ":" + image_detail['tag']

                    foundtypes = []
                    try:
                        subscription_records = catalog.get_subscription(
                            user_auth, subscription_key=fulltag)
                    except Exception as err:
                        subscription_records = []

                    for subscription_record in subscription_records:
                        if subscription_record['subscription_key'] == fulltag:
                            foundtypes.append(
                                subscription_record['subscription_type'])

                    sub_types = anchore_engine.services.common.subscription_types
                    for sub_type in sub_types:
                        if sub_type in ['repo_update']:
                            continue
                        if sub_type not in foundtypes:
                            try:
                                default_active = False
                                if sub_type in autosubscribes:
                                    logger.debug("auto-subscribing image: " +
                                                 str(sub_type))
                                    default_active = True
                                catalog.add_subscription(
                                    user_auth, {
                                        'active': default_active,
                                        'subscription_type': sub_type,
                                        'subscription_key': fulltag
                                    })
                            except:
                                try:
                                    catalog.update_subscription(
                                        user_auth, {
                                            'subscription_type': sub_type,
                                            'subscription_key': fulltag
                                        })
                                except:
                                    pass

                # set the state of the image appropriately
                currstate = image_record['analysis_status']
                if not currstate:
                    newstate = taskstate.init_state('analyze', None)
                elif force or currstate == taskstate.fault_state('analyze'):
                    newstate = taskstate.reset_state('analyze')
                elif image_record['image_status'] == 'deleted':
                    newstate = taskstate.reset_state('analyze')
                else:
                    newstate = currstate

                if (currstate != newstate) or (force):
                    logger.debug("state change detected: " + str(currstate) +
                                 " : " + str(newstate))
                    image_record.update({
                        'image_status': 'active',
                        'analysis_status': newstate
                    })
                    updated_image_record = catalog.update_image(
                        user_auth, imageDigest, image_record)
                    if updated_image_record:
                        image_record = updated_image_record[0]
                else:
                    logger.debug("no state change detected: " +
                                 str(currstate) + " : " + str(newstate))

                httpcode = 200
                return_object = [
                    make_response_image(user_auth, image_record, params)
                ]
            else:
                httpcode = 500
                raise Exception("failed to add image")

    except Exception as err:
        logger.debug("operation exception: " + str(err))
        return_object = anchore_engine.services.common.make_response_error(
            err, in_httpcode=httpcode)
        httpcode = return_object['httpcode']

    return (return_object, httpcode)