def update_listener(self, context, id, listener, tls_containers_changed=False): self._convert_api_to_db(listener) with context.session.begin(subtransactions=True): listener_db = self._get_resource(context, models.Listener, id) if not listener.get('protocol'): # User did not intend to change the protocol so we will just # use the same protocol already stored so the validation knows listener['protocol'] = listener_db.protocol self._validate_listener_data(context, listener) if tls_containers_changed: listener_db.sni_containers = [] for container_id in listener['sni_container_ids']: sni = models.SNI(listener_id=id, tls_container_id=container_id) listener_db.sni_containers.append(sni) listener_db.update(listener) context.session.refresh(listener_db) return data_models.Listener.from_sqlalchemy_model(listener_db)
def create_listener(self, context, listener): self._convert_api_to_db(listener) try: with context.session.begin(subtransactions=True): self._load_id(context, listener) listener['provisioning_status'] = constants.PENDING_CREATE listener['operating_status'] = lb_const.OFFLINE # Check for unspecified loadbalancer_id and listener_id and # set to None for id in ['loadbalancer_id', 'default_pool_id']: if listener.get(id) == n_const.ATTR_NOT_SPECIFIED: listener[id] = None self._validate_listener_data(context, listener) sni_container_ids = [] if 'sni_container_ids' in listener: sni_container_ids = listener.pop('sni_container_ids') try: listener_db_entry = models.Listener(**listener) except Exception as exc: raise exc for container_id in sni_container_ids: sni = models.SNI(listener_id=listener_db_entry.id, tls_container_id=container_id) listener_db_entry.sni_containers.append(sni) context.session.add(listener_db_entry) except exception.DBDuplicateEntry: raise loadbalancerv2.LoadBalancerListenerProtocolPortExists( lb_id=listener['loadbalancer_id'], protocol_port=listener['protocol_port']) context.session.refresh(listener_db_entry.loadbalancer) return data_models.Listener.from_sqlalchemy_model(listener_db_entry)