def _validate_create_hm(self, lock_session, hm_dict): """Validate creating health monitor on pool.""" mandatory_fields = (consts.TYPE, consts.DELAY, consts.TIMEOUT, consts.POOL_ID) for field in mandatory_fields: if hm_dict.get(field, None) is None: raise exceptions.InvalidOption(value='None', option=field) # MAX_RETRIES is renamed fall_threshold so handle is special if hm_dict.get(consts.RISE_THRESHOLD, None) is None: raise exceptions.InvalidOption(value='None', option=consts.MAX_RETRIES) if hm_dict[consts.TYPE] not in (consts.HEALTH_MONITOR_HTTP, consts.HEALTH_MONITOR_HTTPS): if hm_dict.get(consts.HTTP_METHOD, None): raise exceptions.InvalidOption( value=consts.HTTP_METHOD, option='health monitors of ' 'type {}'.format(hm_dict[consts.TYPE])) if hm_dict.get(consts.URL_PATH, None): raise exceptions.InvalidOption( value=consts.URL_PATH, option='health monitors of ' 'type {}'.format(hm_dict[consts.TYPE])) if hm_dict.get(consts.EXPECTED_CODES, None): raise exceptions.InvalidOption( value=consts.EXPECTED_CODES, option='health monitors of ' 'type {}'.format(hm_dict[consts.TYPE])) else: if not hm_dict.get(consts.HTTP_METHOD, None): hm_dict[consts.HTTP_METHOD] = ( consts.HEALTH_MONITOR_HTTP_DEFAULT_METHOD) if not hm_dict.get(consts.URL_PATH, None): hm_dict[consts.URL_PATH] = ( consts.HEALTH_MONITOR_DEFAULT_URL_PATH) if not hm_dict.get(consts.EXPECTED_CODES, None): hm_dict[consts.EXPECTED_CODES] = ( consts.HEALTH_MONITOR_DEFAULT_EXPECTED_CODES) if hm_dict.get('domain_name') and not hm_dict.get('http_version'): raise exceptions.ValidationException( detail=_("'http_version' must be specified when 'domain_name' " "is provided.")) if hm_dict.get('http_version') and hm_dict.get('domain_name'): if hm_dict['http_version'] < 1.1: raise exceptions.InvalidOption( value='http_version %s' % hm_dict['http_version'], option='health monitors HTTP 1.1 domain name health check') try: return self.repositories.health_monitor.create( lock_session, **hm_dict) except odb_exceptions.DBDuplicateEntry: raise exceptions.DuplicateHealthMonitor() except odb_exceptions.DBError: # TODO(blogan): will have to do separate validation protocol # before creation or update since the exception messages # do not give any information as to what constraint failed raise exceptions.InvalidOption(value='', option='')
def post(self, health_monitor): """Creates a health monitor on a pool.""" context = pecan.request.context.get('octavia_context') health_monitor.project_id = self._get_lb_project_id( context.session, self.load_balancer_id) try: db_hm = self.repositories.health_monitor.get( context.session, pool_id=self.pool_id) if db_hm: raise exceptions.DuplicateHealthMonitor() except exceptions.NotFound: pass lock_session = db_api.get_session(autocommit=False) if self.repositories.check_quota_met( context.session, lock_session, data_models.HealthMonitor, health_monitor.project_id): lock_session.rollback() raise exceptions.QuotaException( resource=data_models.HealthMonitor._name() ) try: hm_dict = db_prepare.create_health_monitor( health_monitor.to_dict(render_unsets=True), self.pool_id) self._test_lb_and_listener_statuses(lock_session) db_hm = self.repositories.health_monitor.create(lock_session, **hm_dict) db_new_hm = self._get_db_hm(lock_session) lock_session.commit() except odb_exceptions.DBError: lock_session.rollback() raise exceptions.InvalidOption(value=hm_dict.get('type'), option='type') except Exception: with excutils.save_and_reraise_exception(): lock_session.rollback() try: LOG.info("Sending Creation of Health Monitor for Pool %s to " "handler", self.pool_id) self.handler.create(db_hm) 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_hm, hm_types.HealthMonitorResponse)
def post(self, health_monitor): """Creates a health monitor on a pool.""" session = db_api.get_session() try: db_hm = self.repositories.health_monitor.get(session, pool_id=self.pool_id) if db_hm: raise exceptions.DuplicateHealthMonitor() except exceptions.NotFound: pass hm_dict = health_monitor.to_dict() hm_dict['pool_id'] = self.pool_id # Verify load balancer is in a mutable status. If so it can be assumed # that the listener is also in a mutable status because a load balancer # will only be ACTIVE when all it's listeners as ACTIVE. if not self.repositories.test_and_set_lb_and_listener_prov_status( session, self.load_balancer_id, self.listener_id, constants.PENDING_UPDATE, constants.PENDING_UPDATE): LOG.info( _LI("Health Monitor for Pool %s cannot be updated " "because the Load Balancer is immutable."), self.pool_id) lb_repo = self.repositories.load_balancer db_lb = lb_repo.get(session, id=self.load_balancer_id) raise exceptions.ImmutableObject(resource=db_lb._name(), id=self.load_balancer_id) try: db_hm = self.repositories.health_monitor.create(session, **hm_dict) except odb_exceptions.DBError: # Setting LB and Listener back to active because this is just a # validation failure self.repositories.load_balancer.update( session, self.load_balancer_id, provisioning_status=constants.ACTIVE) self.repositories.listener.update( session, self.listener_id, provisioning_status=constants.ACTIVE) raise exceptions.InvalidOption(value=hm_dict.get('type'), option='type') try: LOG.info( _LI("Sending Creation of Health Monitor for Pool %s to " "handler"), self.pool_id) self.handler.create(db_hm) except Exception: with excutils.save_and_reraise_exception(reraise=False): self.repositories.listener.update( session, self.listener_id, operating_status=constants.ERROR) db_hm = self.repositories.health_monitor.get(session, pool_id=self.pool_id) return self._convert_db_to_type(db_hm, hm_types.HealthMonitorResponse)
def _validate_create_hm(self, lock_session, hm_dict): """Validate creating health monitor on pool.""" try: return self.repositories.health_monitor.create( lock_session, **hm_dict) except odb_exceptions.DBDuplicateEntry: raise exceptions.DuplicateHealthMonitor() except odb_exceptions.DBError: # TODO(blogan): will have to do separate validation protocol # before creation or update since the exception messages # do not give any information as to what constraint failed raise exceptions.InvalidOption(value='', option='')
def post(self, health_monitor): """Creates a health monitor on a pool.""" context = pecan.request.context.get('octavia_context') try: db_hm = self.repositories.health_monitor.get(context.session, pool_id=self.pool_id) if db_hm: raise exceptions.DuplicateHealthMonitor() except exceptions.NotFound: pass hm_dict = db_prepare.create_health_monitor( health_monitor.to_dict(render_unsets=True), self.pool_id) self._test_lb_and_listener_statuses(context.session) try: db_hm = self.repositories.health_monitor.create( context.session, **hm_dict) except odb_exceptions.DBError: # 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) raise exceptions.InvalidOption(value=hm_dict.get('type'), option='type') try: LOG.info( _LI("Sending Creation of Health Monitor for Pool %s to " "handler"), self.pool_id) self.handler.create(db_hm) 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_hm = self._get_db_hm(context.session) return self._convert_db_to_type(db_hm, hm_types.HealthMonitorResponse)