def post(self): """This method handles the POST requests to add agents to the Cloud Verifier. Currently, only agents resources are available for POSTing, i.e. /agents. All other POST uri's will return errors. agents requests require a json block sent in the body """ session = get_session() try: rest_params = config.get_restful_params(self.request.uri) if rest_params is None: config.echo_json_response( self, 405, "Not Implemented: Use /agents/ interface") return if "agents" not in rest_params: config.echo_json_response(self, 400, "uri not supported") logger.warning('POST returning 400 response. uri not supported: %s', self.request.path) return agent_id = rest_params["agents"] if agent_id is not None: content_length = len(self.request.body) if content_length == 0: config.echo_json_response( self, 400, "Expected non zero content length") logger.warning('POST returning 400 response. Expected non zero content length.') else: json_body = json.loads(self.request.body) agent_data = {} agent_data['v'] = json_body['v'] agent_data['ip'] = json_body['cloudagent_ip'] agent_data['port'] = int(json_body['cloudagent_port']) agent_data['operational_state'] = states.START agent_data['public_key'] = "" agent_data['tpm_policy'] = json_body['tpm_policy'] agent_data['vtpm_policy'] = json_body['vtpm_policy'] agent_data['meta_data'] = json_body['metadata'] agent_data['allowlist'] = json_body['allowlist'] agent_data['mb_refstate'] = json_body['mb_refstate'] agent_data['ima_sign_verification_keys'] = json_body['ima_sign_verification_keys'] agent_data['revocation_key'] = json_body['revocation_key'] agent_data['accept_tpm_hash_algs'] = json_body['accept_tpm_hash_algs'] agent_data['accept_tpm_encryption_algs'] = json_body['accept_tpm_encryption_algs'] agent_data['accept_tpm_signing_algs'] = json_body['accept_tpm_signing_algs'] agent_data['hash_alg'] = "" agent_data['enc_alg'] = "" agent_data['sign_alg'] = "" agent_data['agent_id'] = agent_id is_valid, err_msg = cloud_verifier_common.validate_agent_data(agent_data) if not is_valid: config.echo_json_response(self, 400, err_msg) logger.warning(err_msg) return try: new_agent_count = session.query( VerfierMain).filter_by(agent_id=agent_id).count() except SQLAlchemyError as e: logger.error('SQLAlchemy Error: %s', e) # don't allow overwriting if new_agent_count > 0: config.echo_json_response( self, 409, "Agent of uuid %s already exists" % (agent_id)) logger.warning("Agent of uuid %s already exists", agent_id) else: try: # Add the agent and data session.add(VerfierMain(**agent_data)) session.commit() except SQLAlchemyError as e: logger.error('SQLAlchemy Error: %s', e) for key in list(exclude_db.keys()): agent_data[key] = exclude_db[key] asyncio.ensure_future( process_agent(agent_data, states.GET_QUOTE)) config.echo_json_response(self, 200, "Success") logger.info('POST returning 200 response for adding agent id: %s', agent_id) else: config.echo_json_response(self, 400, "uri not supported") logger.warning("POST returning 400 response. uri not supported") except Exception as e: config.echo_json_response(self, 400, "Exception error: %s" % e) logger.warning("POST returning 400 response. Exception error: %s", e) logger.exception(e) self.finish()
def populate_agent(self): self.session.add(VerfierMain(**test_data)) self.session.commit()
def populate_tables(self): allowlist = VerifierAllowlist(**test_allowlist_data) self.session.add(allowlist) self.session.add(VerfierMain(**test_data, ima_policy=allowlist)) self.session.commit()