def delete(self): """Remove a load balancer from the account. :param load_balancer_id: id of lb Urls: DELETE /loadbalancers/{load_balancer_id} Notes: curl -i -H "Accept: application/json" -X DELETE http://dev.server:8080/loadbalancers/1 Returns: None """ load_balancer_id = self.lbid tenant_id = get_limited_to_project(request.headers) # grab the lb with db_session() as session: lb = session.query(LoadBalancer).\ filter(LoadBalancer.id == load_balancer_id).\ filter(LoadBalancer.tenantid == tenant_id).\ filter(LoadBalancer.status != 'DELETED').first() if lb is None: session.rollback() raise NotFound("Load Balancer ID is not valid") # So we can delete ERROR, but not other Immutable states if lb.status in ImmutableStatesNoError: session.rollback() raise ImmutableEntity( 'Cannot delete a Load Balancer in a non-ACTIVE state' ', current state: {0}'.format(lb.status)) lb.status = 'PENDING_DELETE' device = session.query( Device.id, Device.name ).join(LoadBalancer.devices).\ filter(LoadBalancer.id == load_balancer_id).\ first() counter = session.query(Counters).\ filter(Counters.name == 'api_loadbalancers_delete').first() counter.value += 1 if device is None: # This can happen if a device was manually deleted from the DB lb.status = 'DELETED' session.execute(loadbalancers_devices.delete().where( loadbalancers_devices.c.loadbalancer == lb.id)) session.query(Node).\ filter(Node.lbid == lb.id).delete() session.query(HealthMonitor).\ filter(HealthMonitor.lbid == lb.id).delete() session.commit() else: session.commit() submit_job('DELETE', device.name, device.id, lb.id) return None
def delete(self): """Remove a load balancer from the account. :param load_balancer_id: id of lb Urls: DELETE /loadbalancers/{load_balancer_id} Notes: curl -i -H "Accept: application/json" -X DELETE http://dev.server:8080/loadbalancers/1 Returns: None """ load_balancer_id = self.lbid tenant_id = get_limited_to_project(request.headers) # grab the lb with db_session() as session: lb = ( session.query(LoadBalancer) .filter(LoadBalancer.id == load_balancer_id) .filter(LoadBalancer.tenantid == tenant_id) .filter(LoadBalancer.status != "DELETED") .first() ) if lb is None: session.rollback() raise NotFound("Load Balancer ID is not valid") # So we can delete ERROR, but not other Immutable states if lb.status in ImmutableStatesNoError: session.rollback() raise ImmutableEntity( "Cannot delete a Load Balancer in a non-ACTIVE state" ", current state: {0}".format(lb.status) ) lb.status = "PENDING_DELETE" device = ( session.query(Device.id, Device.name) .join(LoadBalancer.devices) .filter(LoadBalancer.id == load_balancer_id) .first() ) if device is None: # This can happen if a device was manually deleted from the DB lb.status = "DELETED" session.execute(loadbalancers_devices.delete().where(loadbalancers_devices.c.loadbalancer == lb.id)) session.query(Node).filter(Node.lbid == lb.id).delete() session.query(HealthMonitor).filter(HealthMonitor.lbid == lb.id).delete() session.commit() else: session.commit() submit_job("DELETE", device.name, device.id, lb.id) return None
def send_delete(self, data): with db_session() as session: count = session.query( LoadBalancer ).join(LoadBalancer.devices).\ filter(Device.id == data).\ filter(LoadBalancer.id != self.lbid).\ filter(LoadBalancer.status != 'DELETED').\ filter(LoadBalancer.status != 'PENDING_DELETE').\ count() if count >= 1: # This is an update message because we want to retain the # remaining LB keep_lb = session.query(LoadBalancer).\ join(LoadBalancer.nodes).\ join(LoadBalancer.devices).\ filter(Device.id == data).\ filter(LoadBalancer.id != self.lbid).\ filter(LoadBalancer.status != 'DELETED').\ filter(LoadBalancer.status != 'PENDING_DELETE').\ first() job_data = { 'hpcs_action': 'UPDATE', 'loadBalancers': [{ 'name': keep_lb.name, 'protocol': keep_lb.protocol, 'algorithm': keep_lb.algorithm, 'port': keep_lb.port, 'nodes': [] }] } for node in keep_lb.nodes: if not node.enabled: continue condition = 'ENABLED' node_data = { 'id': node.id, 'port': node.port, 'address': node.address, 'weight': node.weight, 'condition': condition } job_data['loadBalancers'][0]['nodes'].append(node_data) else: # This is a delete dev = session.query(Device.name).\ filter(Device.id == data).first() vip = session.query(Vip).\ filter(Vip.device == data).first() if vip: submit_vip_job( 'REMOVE', dev.name, str(ipaddress.IPv4Address(vip.ip)) ) job_data = {"hpcs_action": "DELETE"} status, response = self._send_message(job_data, 'hpcs_response') lb = session.query(LoadBalancer).\ filter(LoadBalancer.id == self.lbid).\ first() if not status: LOG.error( "Failed Gearman delete for LB {0}".format(lb.id) ) self._set_error(data, response, session) lb.status = 'DELETED' tenant_id = lb.tenantid if count == 0: # Device should never be used again device = session.query(Device).\ filter(Device.id == data).first() device.status = 'DELETED' # Remove LB-device join session.execute(loadbalancers_devices.delete().where( loadbalancers_devices.c.loadbalancer == lb.id )) session.query(Node).\ filter(Node.lbid == lb.id).delete() session.query(HealthMonitor).\ filter(HealthMonitor.lbid == lb.id).delete() counter = session.query(Counters).\ filter(Counters.name == 'loadbalancers_deleted').first() counter.value += 1 session.commit() # Notify billing of the LB deletion update_mnb('lbaas.instance.delete', self.lbid, tenant_id)
def send_delete(self, data): with db_session() as session: count = session.query( LoadBalancer ).join(LoadBalancer.devices).\ filter(Device.id == data).\ filter(LoadBalancer.id != self.lbid).\ filter(LoadBalancer.status != 'DELETED').\ filter(LoadBalancer.status != 'PENDING_DELETE').\ count() if count >= 1: # This is an update message because we want to retain the # remaining LB keep_lb = session.query(LoadBalancer).\ join(LoadBalancer.nodes).\ join(LoadBalancer.devices).\ filter(Device.id == data).\ filter(LoadBalancer.id != self.lbid).\ filter(LoadBalancer.status != 'DELETED').\ filter(LoadBalancer.status != 'PENDING_DELETE').\ first() job_data = { 'hpcs_action': 'UPDATE', 'loadBalancers': [{ 'name': keep_lb.name, 'protocol': keep_lb.protocol, 'algorithm': keep_lb.algorithm, 'port': keep_lb.port, 'nodes': [] }] } for node in keep_lb.nodes: if not node.enabled: continue condition = 'ENABLED' node_data = { 'id': node.id, 'port': node.port, 'address': node.address, 'weight': node.weight, 'condition': condition } job_data['loadBalancers'][0]['nodes'].append(node_data) else: # This is a delete dev = session.query(Device.name).\ filter(Device.id == data).first() vip = session.query(Vip).\ filter(Vip.device == data).first() if vip: submit_vip_job('REMOVE', dev.name, str(ipaddress.IPv4Address(vip.ip))) job_data = {"hpcs_action": "DELETE"} status, response = self._send_message(job_data, 'hpcs_response') lb = session.query(LoadBalancer).\ filter(LoadBalancer.id == self.lbid).\ first() if not status: LOG.error("Failed Gearman delete for LB {0}".format(lb.id)) self._set_error(data, response, session) lb.status = 'DELETED' tenant_id = lb.tenantid if count == 0: # Device should never be used again device = session.query(Device).\ filter(Device.id == data).first() device.status = 'DELETED' # Remove LB-device join session.execute(loadbalancers_devices.delete().where( loadbalancers_devices.c.loadbalancer == lb.id)) session.query(Node).\ filter(Node.lbid == lb.id).delete() session.query(HealthMonitor).\ filter(HealthMonitor.lbid == lb.id).delete() counter = session.query(Counters).\ filter(Counters.name == 'loadbalancers_deleted').first() counter.value += 1 session.commit() # Notify billing of the LB deletion update_mnb('lbaas.instance.delete', self.lbid, tenant_id)