def update_subscription(subscriptionId, subscription): """ PUT /subscriptions/<subscriptionId> :param subscriptionId: :param subscription: :return: """ request_inputs = anchore_engine.services.common.do_request_prep( request, default_params={}) 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: subscriptiondata = json.loads(bodycontent) subscription_records = catalog.update_subscription( user_auth, subscriptiondata, 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)
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)
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)