def _graph_create(self, lock_session, member_dict): pool = self.repositories.pool.get(lock_session, id=self.pool_id) member_dict = db_prepare.create_member( member_dict, self.pool_id, bool(pool.health_monitor)) db_member = self._validate_create_member(lock_session, member_dict) return db_member
def post(self, member_): """Creates a pool member on a pool.""" member = member_.member context = pecan.request.context.get('octavia_context') # Validate member subnet if member.subnet_id and not validate.subnet_exists(member.subnet_id): raise exceptions.NotFound(resource='Subnet', id=member.subnet_id) pool = self.repositories.pool.get(context.session, id=self.pool_id) member.project_id = self._get_lb_project_id(context.session, pool.load_balancer_id) self._auth_validate_action(context, member.project_id, constants.RBAC_POST) lock_session = db_api.get_session(autocommit=False) try: if self.repositories.check_quota_met(context.session, lock_session, data_models.Member, member.project_id): raise exceptions.QuotaException member_dict = db_prepare.create_member( member.to_dict(render_unsets=True), self.pool_id, bool(pool.health_monitor)) self._test_lb_and_listener_and_pool_statuses(lock_session) db_member = self._validate_create_member(lock_session, member_dict) lock_session.commit() except Exception: with excutils.save_and_reraise_exception(): lock_session.rollback() return self._send_member_to_handler(context.session, db_member)
def post(self, member_): """Creates a pool member on a pool.""" member = member_.member context = pecan.request.context.get('octavia_context') validate.ip_not_reserved(member.address) # Validate member subnet if member.subnet_id and not validate.subnet_exists(member.subnet_id): raise exceptions.NotFound(resource='Subnet', id=member.subnet_id) pool = self.repositories.pool.get(context.session, id=self.pool_id) member.project_id, provider = self._get_lb_project_id_provider( context.session, pool.load_balancer_id) self._auth_validate_action(context, member.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_clusterquota_met( lock_session, data_models.Member, base_res_id=self.pool_id): raise exceptions.ClusterQuotaException( resource=data_models.Member._name()) if self.repositories.check_quota_met(context.session, lock_session, data_models.Member, member.project_id): raise exceptions.QuotaException( resource=data_models.Member._name()) member_dict = db_prepare.create_member( member.to_dict(render_unsets=True), self.pool_id, bool(pool.health_monitor)) self._test_lb_and_listener_and_pool_statuses(lock_session) db_member = self._validate_create_member(lock_session, member_dict) # Prepare the data for the driver data model provider_member = ( driver_utils.db_member_to_provider_member(db_member)) # Dispatch to the driver LOG.info("Sending create Member %s to provider %s", db_member.id, driver.name) driver_utils.call_provider(driver.name, driver.member_create, provider_member) lock_session.commit() except Exception: with excutils.save_and_reraise_exception(): lock_session.rollback() db_member = self._get_db_member(context.session, db_member.id) result = self._convert_db_to_type(db_member, member_types.MemberResponse) return member_types.MemberRootResponse(member=result)
def post(self, member_): """Creates a pool member on a pool.""" member = member_.member context = pecan.request.context.get('octavia_context') validate.ip_not_reserved(member.address) # Validate member subnet if member.subnet_id and not validate.subnet_exists(member.subnet_id): raise exceptions.NotFound(resource='Subnet', id=member.subnet_id) pool = self.repositories.pool.get(context.session, id=self.pool_id) member.project_id, provider = self._get_lb_project_id_provider( context.session, pool.load_balancer_id) self._auth_validate_action(context, member.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.Member, member.project_id): raise exceptions.QuotaException( resource=data_models.Member._name()) member_dict = db_prepare.create_member(member.to_dict( render_unsets=True), self.pool_id, bool(pool.health_monitor)) self._test_lb_and_listener_and_pool_statuses(lock_session) db_member = self._validate_create_member(lock_session, member_dict) # Prepare the data for the driver data model provider_member = ( driver_utils.db_member_to_provider_member(db_member)) # Dispatch to the driver LOG.info("Sending create Member %s to provider %s", db_member.id, driver.name) driver_utils.call_provider( driver.name, driver.member_create, provider_member) lock_session.commit() except Exception: with excutils.save_and_reraise_exception(): lock_session.rollback() db_member = self._get_db_member(context.session, db_member.id) result = self._convert_db_to_type(db_member, member_types.MemberResponse) return member_types.MemberRootResponse(member=result)
def post(self, member): """Creates a pool member on a pool.""" context = pecan.request.context.get('octavia_context') member.project_id = self._get_lb_project_id(context.session, self.load_balancer_id) # Validate member subnet if member.subnet_id: validate.subnet_exists(member.subnet_id) lock_session = db_api.get_session(autocommit=False) if self.repositories.check_quota_met( context.session, lock_session, data_models.Member, member.project_id): lock_session.rollback() raise exceptions.QuotaException( resource=data_models.Member._name() ) try: member_dict = db_prepare.create_member(member.to_dict( render_unsets=True), self.pool_id) self._test_lb_and_listener_statuses(lock_session) db_member = self.repositories.member.create(lock_session, **member_dict) db_new_member = self._get_db_member(lock_session, db_member.id) lock_session.commit() except oslo_exc.DBDuplicateEntry as de: lock_session.rollback() if ['id'] == de.columns: raise exceptions.IDAlreadyExists() raise exceptions.DuplicateMemberEntry( ip_address=member_dict.get('ip_address'), port=member_dict.get('protocol_port')) except Exception: with excutils.save_and_reraise_exception(): lock_session.rollback() try: LOG.info("Sending Creation of Member %s to handler", db_member.id) self.handler.create(db_member) except Exception: for listener_id in self._get_affected_listener_ids( context.session): with excutils.save_and_reraise_exception(reraise=False): self.repositories.listener.update( context.session, listener_id, operating_status=constants.ERROR) return self._convert_db_to_type(db_new_member, member_types.MemberResponse)
def post(self, member): """Creates a pool member on a pool.""" context = pecan.request.context.get('octavia_context') # Validate member subnet if member.subnet_id and not validate.subnet_exists(member.subnet_id): raise exceptions.NotFound(resource='Subnet', id=member.subnet_id) member_dict = db_prepare.create_member(member.to_dict( render_unsets=True), self.pool_id) self._test_lb_and_listener_statuses(context.session) try: db_member = self.repositories.member.create(context.session, **member_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) for listener_id in self._get_affected_listener_ids( context.session): self.repositories.listener.update( context.session, listener_id, provisioning_status=constants.ACTIVE) if ['id'] == de.columns: raise exceptions.IDAlreadyExists() elif (set(['pool_id', 'ip_address', 'protocol_port']) == set(de.columns)): raise exceptions.DuplicateMemberEntry( ip_address=member_dict.get('ip_address'), port=member_dict.get('protocol_port')) try: LOG.info(_LI("Sending Creation of Member %s to handler"), db_member.id) self.handler.create(db_member) except Exception: for listener_id in self._get_affected_listener_ids( context.session): with excutils.save_and_reraise_exception(reraise=False): self.repositories.listener.update( context.session, listener_id, operating_status=constants.ERROR) db_member = self._get_db_member(context.session, db_member.id) return self._convert_db_to_type(db_member, member_types.MemberResponse)
def post(self, member): """Creates a pool member on a pool.""" context = pecan.request.context.get('octavia_context') member_dict = db_prepare.create_member( member.to_dict(render_unsets=True), self.pool_id) self._test_lb_and_listener_statuses(context.session) try: db_member = self.repositories.member.create( context.session, **member_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) for listener_id in self._get_affected_listener_ids( context.session): self.repositories.listener.update( context.session, listener_id, provisioning_status=constants.ACTIVE) if ['id'] == de.columns: raise exceptions.IDAlreadyExists() elif (set(['pool_id', 'ip_address', 'protocol_port']) == set(de.columns)): raise exceptions.DuplicateMemberEntry( ip_address=member_dict.get('ip_address'), port=member_dict.get('protocol_port')) try: LOG.info(_LI("Sending Creation of Member %s to handler"), db_member.id) self.handler.create(db_member) except Exception: for listener_id in self._get_affected_listener_ids( context.session): with excutils.save_and_reraise_exception(reraise=False): self.repositories.listener.update( context.session, listener_id, operating_status=constants.ERROR) db_member = self._get_db_member(context.session, db_member.id) return self._convert_db_to_type(db_member, member_types.MemberResponse)