Beispiel #1
0
    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)
Beispiel #2
0
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']