def parseParams(self, params): obj_dict = params.copy() nodes_list = obj_dict.pop('nodes', []) probes_list = obj_dict.get('healthMonitor', []) vips_list = obj_dict.get('virtualIps', []) stic = obj_dict.get('sessionPersistence', []) try: lb = obj_dict.pop('lb') except KeyError: lb_ref = db_api.loadbalancer_pack_extra(obj_dict) else: lb_ref = db_api.loadbalancer_pack_extra(obj_dict) lb_ref['id'] = lb['id'] lb_ref['tenant_id'] = lb['tenant_id'] lb_ref['created_at'] = lb['created_at'] lb_ref['updated_at'] = lb['updated_at'] lb_ref['status'] = lb_status.BUILD self.lb = lb_ref sf_ref = db_api.serverfarm_pack_extra({}) self.sf = sf_ref self.sf._rservers = [] self.sf._probes = [] self.sf._sticky = [] predictor_ref = db_api.predictor_pack_extra({}) self.sf._predictor = predictor_ref """ Parse RServer nodes and attach them to SF """ for node in nodes_list: rs_ref = db_api.server_pack_extra(node) # We need to check if there is already real server with the # same IP deployed try: parent_ref = db_api.server_get_by_address_on_device(self.conf, rs_ref['address'], lb_ref['device_id']) except exception.ServerNotFound: pass else: if parent_ref.get('address') != '': rs_ref['parent_id'] = parent_ref['id'] self.rs.append(rs_ref) self.sf._rservers.append(rs_ref) for pr in probes_list: probe_ref = db_api.probe_pack_extra(pr) self.probes.append(probe_ref) self.sf._probes.append(probe_ref) for vip in vips_list: vs_ref = db_api.virtualserver_pack_extra(vip) vs_ref['transport'] = lb_ref['extra'].get('transport') vs_ref['appProto'] = lb_ref['protocol'] vs_ref['name'] = vs_ref['id'] self.vips.append(vs_ref) self.vips.append(vs_ref)
def update_lb(conf, lb_id, lb_body): #Step 1. Load LB from DB old_balancer_instance = vserver.Balancer(conf) balancer_instance = vserver.Balancer(conf) logger.debug("Loading LB data from DB for Lb id: %s" % lb_id) #TODO add clone function to vserver.Balancer in order to avoid double read balancer_instance.loadFromDB(lb_id) old_balancer_instance.loadFromDB(lb_id) #Step 2. Parse parameters came from request lb = balancer_instance.lb #old_predictor_id = None #port_updated = False for key in lb_body.keys(): if hasattr(lb, key): logger.debug("updating attribute %s of LB. Value is %s"\ % (key, lb_body[key])) setattr(lb, key, lb_body[key]) if key.lower() == "algorithm": #old_predictor_id = balancer_instance.sf._predictor.id # balancer_instance.sf._predictor =\ # createPredictor(lb_body[key]) balancer_instance.sf._predictor = \ db_api.predictor_pack_extra({'type': lb_body[key]}) else: logger.debug("Got unknown attribute %s of LB. Value is %s"\ % (key, lb_body[key])) #Step 3: Save updated data in DB lb.status = lb_status.PENDING_UPDATE balancer_instance.update() #Step 5. Deploy new config to device device_driver = drivers.get_device_driver(conf, lb['device_id']) try: with device_driver.request_context() as ctx: commands.update_loadbalancer(ctx, old_balancer_instance, balancer_instance) except: old_balancer_instance.lb.status = lb_status.ERROR old_balancer_instance.update() return #balancer_instance.lb.status =\ # balancer.loadbalancers.loadbalancer.LB_ACTIVE_STATUS #balancer_instance.update() #self._task.status = STATUS_DONE return lb['id']