def post(self, rule_): """Creates a l7rule on an l7policy.""" l7rule = rule_.rule context = pecan_request.context.get('octavia_context') db_l7policy = self._get_db_l7policy(context.session, self.l7policy_id, show_deleted=False) load_balancer_id, listener_id = self._get_listener_and_loadbalancer_id( db_l7policy) l7rule.project_id, provider = self._get_lb_project_id_provider( context.session, load_balancer_id) self._auth_validate_action(context, l7rule.project_id, constants.RBAC_POST) try: validate.l7rule_data(l7rule) except Exception as e: raise exceptions.L7RuleValidation(error=e) self._check_l7policy_max_rules(context.session) # Load the driver early as it also provides validation driver = driver_factory.get_driver(provider) lock_session = db_api.get_session(autocommit=False) try: if self.repositories.check_quota_met( context.session, lock_session, data_models.L7Rule, l7rule.project_id): raise exceptions.QuotaException( resource=data_models.L7Rule._name()) l7rule_dict = db_prepare.create_l7rule( l7rule.to_dict(render_unsets=True), self.l7policy_id) self._test_lb_listener_policy_statuses(context.session) db_l7rule = self._validate_create_l7rule(lock_session, l7rule_dict) # Prepare the data for the driver data model provider_l7rule = ( driver_utils.db_l7rule_to_provider_l7rule(db_l7rule)) # Dispatch to the driver LOG.info("Sending create L7 Rule %s to provider %s", db_l7rule.id, driver.name) driver_utils.call_provider( driver.name, driver.l7rule_create, provider_l7rule) lock_session.commit() except Exception: with excutils.save_and_reraise_exception(): lock_session.rollback() db_l7rule = self._get_db_l7rule(context.session, db_l7rule.id) result = self._convert_db_to_type(db_l7rule, l7rule_types.L7RuleResponse) return l7rule_types.L7RuleRootResponse(rule=result)
def post(self, rule_): """Creates a l7rule on an l7policy.""" l7rule = rule_.rule try: validate.l7rule_data(l7rule) except Exception as e: raise exceptions.L7RuleValidation(error=e) context = pecan.request.context.get('octavia_context') l7rule.project_id = self._get_l7policy_project_id(context.session, self.l7policy_id) self._check_l7policy_max_rules(context.session) self._auth_validate_action(context, l7rule.project_id, constants.RBAC_POST) lock_session = db_api.get_session(autocommit=False) l7rule_dict = db_prepare.create_l7rule( l7rule.to_dict(render_unsets=True), self.l7policy_id) try: self._test_lb_listener_policy_statuses(context.session) db_l7rule = self._validate_create_l7rule(lock_session, l7rule_dict) lock_session.commit() except Exception: with excutils.save_and_reraise_exception(): lock_session.rollback() return self._send_l7rule_to_handler(context.session, db_l7rule)
def _graph_create(self, lock_session, rule_dict): try: validate.l7rule_data(l7rule_types.L7RulePOST(**rule_dict)) except Exception as e: raise exceptions.L7RuleValidation(error=e) rule_dict = db_prepare.create_l7rule(rule_dict, self.l7policy_id) db_rule = self._validate_create_l7rule(lock_session, rule_dict) return db_rule
def post(self, l7rule): """Creates a l7rule on an l7policy.""" try: validate.l7rule_data(l7rule) except Exception as e: raise exceptions.L7RuleValidation(error=e) context = pecan.request.context.get('octavia_context') self._check_l7policy_max_rules(context.session) l7rule_dict = db_prepare.create_l7rule( l7rule.to_dict(render_unsets=True), self.l7policy_id) self._test_lb_and_listener_statuses(context.session) try: db_l7rule = self.repositories.l7rule.create( context.session, **l7rule_dict) except oslo_exc.DBDuplicateEntry as de: # Setting LB and Listener back to active because this is just a # validation failure self.repositories.load_balancer.update( context.session, self.load_balancer_id, provisioning_status=constants.ACTIVE) self.repositories.listener.update( context.session, self.listener_id, provisioning_status=constants.ACTIVE) if ['id'] == de.columns: raise exceptions.IDAlreadyExists() try: LOG.info(_LI("Sending Creation of L7Rule %s to handler"), db_l7rule.id) self.handler.create(db_l7rule) except Exception: with excutils.save_and_reraise_exception(reraise=False): self.repositories.listener.update( context.session, self.listener_id, operating_status=constants.ERROR) db_l7rule = self._get_db_l7rule(context.session, db_l7rule.id) return self._convert_db_to_type(db_l7rule, l7rule_types.L7RuleResponse)
def post(self, l7rule): """Creates a l7rule on an l7policy.""" try: validate.l7rule_data(l7rule) except Exception as e: raise exceptions.L7RuleValidation(error=e) context = pecan.request.context.get('octavia_context') self._check_l7policy_max_rules(context.session) l7rule_dict = db_prepare.create_l7rule( l7rule.to_dict(render_unsets=True), self.l7policy_id) self._test_lb_and_listener_statuses(context.session) try: db_l7rule = self.repositories.l7rule.create(context.session, **l7rule_dict) except oslo_exc.DBDuplicateEntry as de: # Setting LB and Listener back to active because this is just a # validation failure self.repositories.load_balancer.update( context.session, self.load_balancer_id, provisioning_status=constants.ACTIVE) self.repositories.listener.update( context.session, self.listener_id, provisioning_status=constants.ACTIVE) if ['id'] == de.columns: raise exceptions.IDAlreadyExists() try: LOG.info(_LI("Sending Creation of L7Rule %s to handler"), db_l7rule.id) self.handler.create(db_l7rule) except Exception: with excutils.save_and_reraise_exception(reraise=False): self.repositories.listener.update( context.session, self.listener_id, operating_status=constants.ERROR) db_l7rule = self._get_db_l7rule(context.session, db_l7rule.id) return self._convert_db_to_type(db_l7rule, l7rule_types.L7RuleResponse)