def get(self, id): """Gets a single l7policy's details.""" context = pecan.request.context.get('octavia_context') db_l7policy = self._get_db_l7policy(context.session, id) result = self._convert_db_to_type(db_l7policy, l7policy_types.L7PolicyResponse) return l7policy_types.L7PolicyRootResponse(l7policy=result)
def put(self, id, l7policy_): """Updates a l7policy.""" l7policy = l7policy_.l7policy l7policy_dict = validate.sanitize_l7policy_api_args( l7policy.to_dict(render_unsets=False)) # Reset renamed attributes for attr, val in l7policy_types.L7PolicyPUT._type_to_model_map.items(): if val in l7policy_dict: l7policy_dict[attr] = l7policy_dict.pop(val) sanitized_l7policy = l7policy_types.L7PolicyPUT(**l7policy_dict) context = pecan.request.context.get('octavia_context') # Make sure any specified redirect_pool_id exists if l7policy_dict.get('redirect_pool_id'): self._get_db_pool(context.session, l7policy_dict['redirect_pool_id']) db_l7policy = self._get_db_l7policy(context.session, id, show_deleted=False) load_balancer_id, listener_id = self._get_listener_and_loadbalancer_id( db_l7policy) project_id, provider = self._get_lb_project_id_provider( context.session, load_balancer_id) self._auth_validate_action(context, project_id, constants.RBAC_PUT) # Load the driver early as it also provides validation driver = driver_factory.get_driver(provider) with db_api.get_lock_session() as lock_session: self._test_lb_and_listener_statuses(lock_session, lb_id=load_balancer_id, listener_ids=[listener_id]) # Prepare the data for the driver data model l7policy_dict = sanitized_l7policy.to_dict(render_unsets=False) l7policy_dict['id'] = id provider_l7policy_dict = ( driver_utils.l7policy_dict_to_provider_dict(l7policy_dict)) # Dispatch to the driver LOG.info("Sending update L7 Policy %s to provider %s", id, driver.name) driver_utils.call_provider( driver.name, driver.l7policy_update, driver_dm.L7Policy.from_dict(provider_l7policy_dict)) # Update the database to reflect what the driver just accepted sanitized_l7policy.provisioning_status = constants.PENDING_UPDATE db_l7policy_dict = sanitized_l7policy.to_dict(render_unsets=False) self.repositories.l7policy.update(lock_session, id, **db_l7policy_dict) # Force SQL alchemy to query the DB, otherwise we get inconsistent # results context.session.expire_all() db_l7policy = self._get_db_l7policy(context.session, id) result = self._convert_db_to_type(db_l7policy, l7policy_types.L7PolicyResponse) return l7policy_types.L7PolicyRootResponse(l7policy=result)
def delete(self, id): """Deletes a l7policy.""" context = pecan.request.context.get('octavia_context') db_l7policy = self._get_db_l7policy(context.session, id) load_balancer_id, listener_id = self._get_listener_and_loadbalancer_id( db_l7policy) self._test_lb_and_listener_statuses(context.session, lb_id=load_balancer_id, listener_ids=[listener_id]) self.repositories.l7policy.update( context.session, db_l7policy.id, provisioning_status=constants.PENDING_DELETE) try: LOG.info(_LI("Sending Deletion of L7Policy %s to handler"), db_l7policy.id) self.handler.delete(db_l7policy) except Exception: with excutils.save_and_reraise_exception( reraise=False), db_api.get_lock_session() as lock_session: self._reset_lb_and_listener_statuses( lock_session, lb_id=load_balancer_id, listener_id=db_l7policy.listener_id) # L7Policy now goes to ERROR self.repositories.l7policy.update( lock_session, db_l7policy.id, provisioning_status=constants.ERROR) db_l7policy = self.repositories.l7policy.get(context.session, id=id) result = self._convert_db_to_type(db_l7policy, l7policy_types.L7PolicyResponse) return l7policy_types.L7PolicyRootResponse(l7policy=result)
def post(self, l7policy_): """Creates a l7policy on a listener.""" l7policy = l7policy_.l7policy context = pecan.request.context.get('octavia_context') # Make sure any pool specified by redirect_pool_id exists if l7policy.redirect_pool_id: db_pool = self._get_db_pool(context.session, l7policy.redirect_pool_id) self._escape_l7policy_udp_pool_request(db_pool) # Verify the parent listener exists listener_id = l7policy.listener_id listener = self._get_db_listener(context.session, listener_id) load_balancer_id = listener.load_balancer_id l7policy.project_id, provider = self._get_lb_project_id_provider( context.session, load_balancer_id) self._auth_validate_action(context, l7policy.project_id, constants.RBAC_POST) # 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.L7Policy, l7policy.project_id): raise exceptions.QuotaException( resource=data_models.L7Policy._name()) l7policy_dict = db_prepare.create_l7policy( l7policy.to_dict(render_unsets=True), load_balancer_id, listener_id) self._test_lb_and_listener_statuses(lock_session, lb_id=load_balancer_id, listener_ids=[listener_id]) db_l7policy = self._validate_create_l7policy( lock_session, l7policy_dict) # Prepare the data for the driver data model provider_l7policy = ( driver_utils.db_l7policy_to_provider_l7policy(db_l7policy)) # Dispatch to the driver LOG.info("Sending create L7 Policy %s to provider %s", db_l7policy.id, driver.name) driver_utils.call_provider(driver.name, driver.l7policy_create, provider_l7policy) lock_session.commit() except Exception: with excutils.save_and_reraise_exception(): lock_session.rollback() db_l7policy = self._get_db_l7policy(context.session, db_l7policy.id) result = self._convert_db_to_type(db_l7policy, l7policy_types.L7PolicyResponse) return l7policy_types.L7PolicyRootResponse(l7policy=result)
def get(self, id): """Gets a single l7policy's details.""" context = pecan.request.context.get('octavia_context') db_l7policy = self._get_db_l7policy(context.session, id) self._auth_validate_action(context, db_l7policy.project_id, constants.RBAC_GET_ONE) result = self._convert_db_to_type(db_l7policy, l7policy_types.L7PolicyResponse) return l7policy_types.L7PolicyRootResponse(l7policy=result)
def put(self, id, l7policy_): """Updates a l7policy.""" l7policy = l7policy_.l7policy l7policy_dict = validate.sanitize_l7policy_api_args( l7policy.to_dict(render_unsets=False)) # Reset renamed attributes for attr, val in l7policy_types.L7PolicyPUT._type_to_model_map.items(): if val in l7policy_dict: l7policy_dict[attr] = l7policy_dict.pop(val) sanitized_l7policy = l7policy_types.L7PolicyPUT(**l7policy_dict) context = pecan.request.context.get('octavia_context') # Make sure any specified redirect_pool_id exists if l7policy_dict.get('redirect_pool_id'): self._get_db_pool(context.session, l7policy_dict['redirect_pool_id']) db_l7policy = self._get_db_l7policy(context.session, id, show_deleted=False) load_balancer_id, listener_id = self._get_listener_and_loadbalancer_id( db_l7policy) self._auth_validate_action(context, db_l7policy.project_id, constants.RBAC_PUT) self._test_lb_and_listener_statuses(context.session, lb_id=load_balancer_id, listener_ids=[listener_id]) self.repositories.l7policy.update( context.session, db_l7policy.id, provisioning_status=constants.PENDING_UPDATE) try: LOG.info("Sending Update of L7Policy %s to handler", id) self.handler.update(db_l7policy, sanitized_l7policy) except Exception: with excutils.save_and_reraise_exception( reraise=False), db_api.get_lock_session() as lock_session: self._reset_lb_and_listener_statuses( lock_session, lb_id=load_balancer_id, listener_id=db_l7policy.listener_id) # L7Policy now goes to ERROR self.repositories.l7policy.update( lock_session, db_l7policy.id, provisioning_status=constants.ERROR) db_l7policy = self._get_db_l7policy(context.session, id) result = self._convert_db_to_type(db_l7policy, l7policy_types.L7PolicyResponse) return l7policy_types.L7PolicyRootResponse(l7policy=result)
def get(self, id, fields=None): """Gets a single l7policy's details.""" context = pecan.request.context.get('octavia_context') db_l7policy = self._get_db_l7policy(context.session, id, show_deleted=False) self._auth_validate_action(context, db_l7policy.project_id, constants.RBAC_GET_ONE) result = self._convert_db_to_type( db_l7policy, l7policy_types.L7PolicyResponse) if fields is not None: result = self._filter_fields([result], fields)[0] return l7policy_types.L7PolicyRootResponse(l7policy=result)
def _send_l7policy_to_handler(self, session, db_l7policy, lb_id): try: LOG.info(_LI("Sending Creation of L7Policy %s to handler"), db_l7policy.id) self.handler.create(db_l7policy) except Exception: with excutils.save_and_reraise_exception( reraise=False), db_api.get_lock_session() as lock_session: self._reset_lb_and_listener_statuses( lock_session, lb_id=lb_id, listener_id=db_l7policy.listener_id) # L7Policy now goes to ERROR self.repositories.l7policy.update( lock_session, db_l7policy.id, provisioning_status=constants.ERROR) db_l7policy = self._get_db_l7policy(session, db_l7policy.id) result = self._convert_db_to_type(db_l7policy, l7policy_types.L7PolicyResponse) return l7policy_types.L7PolicyRootResponse(l7policy=result)