def delete(name, del_lbs): """ 删除 lb. 要删除的 lb 应该先下线, 这里只在数据库中删除. """ # 检查是否重复. if len(del_lbs) != len(set(del_lbs)): logger.error("Lb duplicates") return False # 检查 lb 是否存在. checkdict = {"name": name, "lbs": del_lbs} if not funcs.check(checkdict, check_exist=True): logger.error("Cluster or some lbs not exist") return False # 获取集群信息. key = "cluster:%s" % name old_lbinfos = eval(client.hget(key, "lbinfos")) # 删除 lb. lbinfos = copy.deepcopy(old_lbinfos) for i in lbinfos: for j in del_lbs: if i["hostname"] == j: lbinfos.remove(i) client.hset(key, "lbinfos", lbinfos) logger.info("Lbs deleted:%s" % ",".join(del_lbs)) return True
def delete(name, del_vips): """ 删除 vip. """ # 检查是否重复. if len(del_vips) != len(set(del_vips)): logger.error("Vip duplicates") return False # 检查是否存在. checkdict = {"name": name, "vips": del_vips} if not funcs.check(checkdict, check_exist=True): logger.error("Cluster or some vips not exist") return False # 获取集群信息. key = "cluster:%s" % name old_vip2ws = eval(client.hget(key, "vip2ws")) # 获取新的 vip2ws. vip2ws = copy.deepcopy(old_vip2ws) for i in vip2ws: for j in del_vips: if i["vip"] == j: vip2ws.remove(i) # 保存集群信息. client.hset(key, "vip2ws", vip2ws) logger.info("Vips deleted:%s" % ",".join(del_vips)) return True
def modify(name, vip, wstype): """ 修改一个集群的一个 vip 的 wstype. """ # 检查集群是否存在. check_dict = {"name": name} if not funcs.check(check_dict, check_exist=True): logger.error("No cluster:%s" % name) return False # 获取集群信息. key = "cluster:%s" % name old_vip2ws = eval(client.hget(key, "vip2ws")) # 检查 vip 是否存在. vips = [i["vip"] for i in old_vip2ws] if vip not in vips: logger.error("No vip:%s" % vip) return False # 修改 wstype. vip2ws = list() for i in old_vip2ws: if i["vip"] == vip: i["wstype"] = wstype vip2ws.append(i) else: vip2ws.append(i) # 保存集群信息. client.hset(key, "vip2ws", vip2ws) logger.info("Wstype modified:%s, %s" % (vip, wstype)) return True
def delete(name, del_lbs): """ 删除 lb. 要删除的 lb 应该先下线, 这里只在数据库中删除. """ # 检查是否重复. if len(del_lbs) != len(set(del_lbs)): logger.error("Lb duplicates") return False # 检查 lb 是否存在. checkdict = { "name": name, "lbs": del_lbs } if not funcs.check(checkdict, check_exist=True): logger.error("Cluster or some lbs not exist") return False # 获取集群信息. key = "cluster:%s" % name old_lbinfos = eval(client.hget(key, "lbinfos")) # 删除 lb. lbinfos = copy.deepcopy(old_lbinfos) for i in lbinfos: for j in del_lbs: if i["hostname"] == j: lbinfos.remove(i) client.hset(key, "lbinfos", lbinfos) logger.info("Lbs deleted:%s" % ",".join(del_lbs)) return True
def delete(name, del_vips): """ 删除 vip. """ # 检查是否重复. if len(del_vips) != len(set(del_vips)): logger.error("Vip duplicates") return False # 检查是否存在. checkdict = { "name": name, "vips": del_vips } if not funcs.check(checkdict, check_exist=True): logger.error("Cluster or some vips not exist") return False # 获取集群信息. key = "cluster:%s" % name old_vip2ws = eval(client.hget(key, "vip2ws")) # 获取新的 vip2ws. vip2ws = copy.deepcopy(old_vip2ws) for i in vip2ws: for j in del_vips: if i["vip"] == j: vip2ws.remove(i) # 保存集群信息. client.hset(key, "vip2ws", vip2ws) logger.info("Vips deleted:%s" % ",".join(del_vips)) return True
def modify(name, vip, sport, port): """ 修改一个集群的一个 vip 的一个 port. sport 指明是哪个端口; port 是一个 dict, 格式如下: { dport: aaa, synproxy: 0, sport: bbb, persistence_timeout: 50 } dict 中的 sport 可以不指定, 如果指定会修改成指定值; 另外三个字段可以随意指定, 不指定的话不修改. """ # 检查集群是否存在. check_dict = { "name": name, } if not funcs.check(check_dict, check_exist=True): logger.error("No cluster:%s" % name) return False # 获取集群信息. key = "cluster:%s" % name old_vip2ws = eval(client.hget(key, "vip2ws")) # 检查 vip 是否存在. vips = [i["vip"] for i in old_vip2ws] if vip not in vips: logger.error("No vip:%s" % vip) return False # 增加 ports. vip2ws = list() for i in old_vip2ws: if i["vip"] == vip: for j in i["ports"]: if j["sport"] == sport: _tmp = copy.deepcopy(j) for _key in port: _tmp[_key] = port[_key] i["ports"].remove(j) i["ports"].append(_tmp) vip2ws.append(i) else: vip2ws.append(i) # 保存集群信息. client.hset(key, "vip2ws", vip2ws) logger.info("Ports modified:%s, %s, %s" % (vip, sport, port)) return True
def add(name, new_vip2ws): """ 增加 VIP. """ # 检查集群是否存在. checkdict = { "name": name, } if not funcs.check(checkdict, check_exist=True): logger.error("No cluster:%s" % name) return False # 获取新增 vip. new_vips = [i["vip"] for i in new_vip2ws] if len(new_vips) != len(set(new_vips)): logger.error("Vip duplicates") return False # 检查新增 vip 是否存在. checkdict = { "vips": new_vips, } if not funcs.check(checkdict, check_exist=False): logger.error("Some vips exist") return False # 获取集群信息. key = "cluster:%s" % name old_vip2ws = eval(client.hget(key, "vip2ws")) # 获取新的 vip2ws. vip2ws = copy.deepcopy(old_vip2ws) vip2ws.extend(new_vip2ws) del old_vip2ws # 保存集群信息. client.hset(key, "vip2ws", vip2ws) logger.info("Vips added:%s" % new_vip2ws) return True
def add(name, new_vip2ws): """ 增加 Ws. 由于 ws 属于 vip, 所以需要传入 vip, 而且 vip 都要存在. new_vip2ws 只需要含有 vip 和 wss 两个 key 即可. """ # 获取 vip. share_vips = [i["vip"] for i in new_vip2ws] if len(share_vips) != len(set(share_vips)): logger.error("Vip duplicates") return False # 检查是否 vip 是否存在. checkdict = { "name": name, "vips": share_vips } if not funcs.check(checkdict, check_exist=True): logger.error("Cluster or some vips not exist") return False # 获取集群信息. key = "cluster:%s" % name old_vip2ws = eval(client.hget(key, "vip2ws")) # 检查 vip 是否在集群中. vips = [i["vip"] for i in old_vip2ws] if True in map(lambda x:x not in vips, share_vips): logger.error("Some vips not exist") return False # 生成新的 vip2ws. vip2ws = list() for i in old_vip2ws: if i["vip"] in share_vips: for j in new_vip2ws: if i["vip"] == j["vip"]: tmp = copy.deepcopy(i["wss"]) map(lambda x:tmp.append(x), j["wss"]) i["wss"] = list(set(tmp)) vip2ws.append(i) else: vip2ws.append(i) # 保存集群信息. client.hset(key, "vip2ws", vip2ws) logger.info("Wss added:%s" % new_vip2ws) return True
def add(name, new_vip2ws): """ 增加 Ws. 由于 ws 属于 vip, 所以需要传入 vip, 而且 vip 都要存在. new_vip2ws 只需要含有 vip 和 wss 两个 key 即可. """ # 获取 vip. share_vips = [i["vip"] for i in new_vip2ws] if len(share_vips) != len(set(share_vips)): logger.error("Vip duplicates") return False # 检查是否 vip 是否存在. checkdict = {"name": name, "vips": share_vips} if not funcs.check(checkdict, check_exist=True): logger.error("Cluster or some vips not exist") return False # 获取集群信息. key = "cluster:%s" % name old_vip2ws = eval(client.hget(key, "vip2ws")) # 检查 vip 是否在集群中. vips = [i["vip"] for i in old_vip2ws] if True in map(lambda x: x not in vips, share_vips): logger.error("Some vips not exist") return False # 生成新的 vip2ws. vip2ws = list() for i in old_vip2ws: if i["vip"] in share_vips: for j in new_vip2ws: if i["vip"] == j["vip"]: tmp = copy.deepcopy(i["wss"]) map(lambda x: tmp.append(x), j["wss"]) i["wss"] = list(set(tmp)) vip2ws.append(i) else: vip2ws.append(i) # 保存集群信息. client.hset(key, "vip2ws", vip2ws) logger.info("Wss added:%s" % new_vip2ws) return True
def delete(name, del_vip2ws): """ 删除 ws. 由于 ws 属于 vip, 所以需要传入 vip, 而且 vip 都要存在. new_vip2ws 只需要含有 vip 和 wss 两个 key 即可. """ # 获取 vip. share_vips = [i["vip"] for i in del_vip2ws] if len(share_vips) != len(set(share_vips)): logger.error("Vip duplicates") return False # 检查是否 vip 是否存在. checkdict = { "name": name, "vips": share_vips } if not funcs.check(checkdict, check_exist=True): logger.error("Cluster or some vips not exist") return False # 获取集群信息. key = "cluster:%s" % name old_vip2ws = eval(client.hget(key, "vip2ws")) # 获取新的 vip2ws. vip2ws = list() for i in old_vip2ws: if i["vip"] in share_vips: old_wss = copy.deepcopy(i["wss"]) for j in del_vip2ws: if i["vip"] == j["vip"]: break del_wss = copy.deepcopy(j["wss"]) i["wss"] = list(set(old_wss) - set(del_wss)) vip2ws.append(i) else: vip2ws.append(i) # 保存集群信息. client.hset(key, "vip2ws", vip2ws) logger.info("Wss deleted:%s" % del_vip2ws) return True
def delete(name, del_vip2ws): """ 删除 ws. 由于 ws 属于 vip, 所以需要传入 vip, 而且 vip 都要存在. new_vip2ws 只需要含有 vip 和 wss 两个 key 即可. """ # 获取 vip. share_vips = [i["vip"] for i in del_vip2ws] if len(share_vips) != len(set(share_vips)): logger.error("Vip duplicates") return False # 检查是否 vip 是否存在. checkdict = {"name": name, "vips": share_vips} if not funcs.check(checkdict, check_exist=True): logger.error("Cluster or some vips not exist") return False # 获取集群信息. key = "cluster:%s" % name old_vip2ws = eval(client.hget(key, "vip2ws")) # 获取新的 vip2ws. vip2ws = list() for i in old_vip2ws: if i["vip"] in share_vips: old_wss = copy.deepcopy(i["wss"]) for j in del_vip2ws: if i["vip"] == j["vip"]: break del_wss = copy.deepcopy(j["wss"]) i["wss"] = list(set(old_wss) - set(del_wss)) vip2ws.append(i) else: vip2ws.append(i) # 保存集群信息. client.hset(key, "vip2ws", vip2ws) logger.info("Wss deleted:%s" % del_vip2ws) return True
def delete(name): """ 删除一个集群. 删除集群需要在集群完全不用之后, 只删除数据库信息. """ # 检查集群是否存在. check_dict = { "name": name, } if not funcs.check(check_dict, check_exist=True): logger.error("No cluster:%s" % name) return False key = "cluster:%s" % name client.delete(key) logger.info("Cluster deleted:%s" % name) return True
def delete(name, vip, sports): """ 删除一个集群的一个 vip 的若干个端口. sports 是一个 list, 格式如下: [80, 443, ...] """ # 检查集群是否存在. check_dict = { "name": name, } if not funcs.check(check_dict, check_exist=True): logger.error("No cluster:%s" % name) return False # 获取集群信息. key = "cluster:%s" % name old_vip2ws = eval(client.hget(key, "vip2ws")) # 检查 vip 是否存在. vips = [i["vip"] for i in old_vip2ws] if vip not in vips: logger.error("No vip:%s" % vip) return False # 增加 ports. vip2ws = list() for i in old_vip2ws: if i["vip"] == vip: for j in i["ports"]: if j["sport"] in sports: i["ports"].remove(j) vip2ws.append(i) else: vip2ws.append(i) # 保存集群信息. client.hset(key, "vip2ws", vip2ws) logger.info("Ports deleted:%s, %s" % (vip, sports)) return True
def modify(name, vip, wstype): """ 修改一个集群的一个 vip 的 wstype. """ # 检查集群是否存在. check_dict = { "name": name, } if not funcs.check(check_dict, check_exist=True): logger.error("No cluster:%s" % name) return False # 获取集群信息. key = "cluster:%s" % name old_vip2ws = eval(client.hget(key, "vip2ws")) # 检查 vip 是否存在. vips = [i["vip"] for i in old_vip2ws] if vip not in vips: logger.error("No vip:%s" % vip) return False # 修改 wstype. vip2ws = list() for i in old_vip2ws: if i["vip"] == vip: i["wstype"] = wstype vip2ws.append(i) else: vip2ws.append(i) # 保存集群信息. client.hset(key, "vip2ws", vip2ws) logger.info("Wstype modified:%s, %s" % (vip, wstype)) return True
def add(name, vip, ports): """ 对一个集群的一个 vip 增加若干个 port. ports 是一个 list, 格式如下: [ { dport: xxx, synproxy: 1, sport: yyy, persistence_timeout: 50 }, { dport: aaa, synproxy: 0, sport: bbb, persistence_timeout: 50 }, ... ] 事实上如何鉴别多个 port 是否重复呢, 答案是根据 sport. """ # 检查集群是否存在. check_dict = { "name": name, } if not funcs.check(check_dict, check_exist=True): logger.error("No cluster:%s" % name) return False # 获取集群信息. key = "cluster:%s" % name old_vip2ws = eval(client.hget(key, "vip2ws")) # 检查 vip 是否存在. vips = [i["vip"] for i in old_vip2ws] if vip not in vips: logger.error("No vip:%s" % vip) return False # 增加 ports. vip2ws = list() for i in old_vip2ws: if i["vip"] == vip: old_sports = [x["sport"] for x in i["ports"]] new_sports = [x["sport"] for x in ports] if True in map(lambda x:x in old_sports, new_sports): logger.error("Sport duplicates:%s" % new_sports) return False i["ports"].extend(ports) vip2ws.append(i) else: vip2ws.append(i) # 保存集群信息. client.hset(key, "vip2ws", vip2ws) logger.info("Ports added:%s, %s" % (vip, ports)) return True
def add(name, vip, ports): """ 对一个集群的一个 vip 增加若干个 port. ports 是一个 list, 格式如下: [ { dport: xxx, synproxy: 1, sport: yyy, persistence_timeout: 50 }, { dport: aaa, synproxy: 0, sport: bbb, persistence_timeout: 50 }, ... ] 事实上如何鉴别多个 port 是否重复呢, 答案是根据 sport. """ # 检查集群是否存在. check_dict = { "name": name, } if not funcs.check(check_dict, check_exist=True): logger.error("No cluster:%s" % name) return False # 获取集群信息. key = "cluster:%s" % name old_vip2ws = eval(client.hget(key, "vip2ws")) # 检查 vip 是否存在. vips = [i["vip"] for i in old_vip2ws] if vip not in vips: logger.error("No vip:%s" % vip) return False # 增加 ports. vip2ws = list() for i in old_vip2ws: if i["vip"] == vip: old_sports = [x["sport"] for x in i["ports"]] new_sports = [x["sport"] for x in ports] if True in map(lambda x: x in old_sports, new_sports): logger.error("Sport duplicates:%s" % new_sports) return False i["ports"].extend(ports) vip2ws.append(i) else: vip2ws.append(i) # 保存集群信息. client.hset(key, "vip2ws", vip2ws) logger.info("Ports added:%s, %s" % (vip, ports)) return True
def add(name, new_lbinfos): """ 增加 lb. """ # 检查集群是否存在. checkdict = { "name": name, } if not funcs.check(checkdict, check_exist=True): logger.error("No cluster:%s" % name) return False # 获取新增 lb. new_lbs = [i["hostname"] for i in new_lbinfos] if len(new_lbs) != len(set(new_lbs)): logger.error("Lb duplicates") return False # 检查新增 lb 是否已经存在. checkdict = { "lbs": new_lbs } if not funcs.check(checkdict, check_exist=False): logger.error("Some lbs exist") return False # 对所有 lb 安装 lvs fullnat. ret = funcs.lb_multi(new_lbs) fails = [ i for i in ret if not i["result"]] if fails != []: message = "Some lbs install failed:%s" % \ ",".join(fails) logger.error(message) return False message = "All lbs install success:%s" % \ ",".join(new_lbs) logger.info(message) # 获取已有集群信息. key = "cluster:%s" % name _type = client.hget(key, "type") old_lbinfos = eval(client.hget(key, "lbinfos")) device = client.hget(key, "device") # 获取新的 lbinfos. lbinfos = copy.deepcopy(old_lbinfos) lbinfos.extend(new_lbinfos) del old_lbinfos # 配置 lb. for lbinfo in new_lbinfos: lb = lbinfo["hostname"] internalip = lbinfo["internalip"] internalnetmask = lbinfo["internalnetmask"] internalgateway = lbinfo["internalgateway"] # 如果 _type 是 extra, 需要公网 IP; # 如果 _type 是 internal, 不需要公网 IP. extraip = lbinfo.get("extraip", None) extranetmask = lbinfo.get("extranetmask", None) extragateway = lbinfo.get("extragateway", None) # 配置 IP. ret = funcs.ip(lb, _type, device, internalip, internalnetmask, internalgateway, extraip, extranetmask, extragateway) if not ret: return False # 配置 lip. _lips = lips.get(internalip, internalnetmask) ret = funcs.lips(lb, internalip, _lips) if not ret: logger.error("Cfg lb lips failed:%s" % lb) return False logger.info("Cfg lb lips success:%s" % lb) # 保存集群信息. client.hset(key, "lbinfos", lbinfos) logger.info("Lbs added:%s" % ",".join(new_lbs)) return True
def add(name, _type, lbinfos, vip2ws, vipnets, device): """ 增加一个 cluster. """ # 拿到 lb 信息. lbs = [i["hostname"] for i in lbinfos] if len(lbs) != len(set(lbs)): logger.error("Lb duplicates") return False # 拿到 vip 信息. vips = [i["vip"] for i in vip2ws] if len(vips) != len(set(vips)): logger.error("Vip duplicates") return False # 检查 name, lb 和 vip 是否不存在. check_dict = { "name": name, "lbs": lbs, "vips": vips, } if not funcs.check(check_dict, check_exist=False): logger.error("Cluster or lbs or vips has exists.") return False # 对所有 lb 安装 lvs fullnat. ret = funcs.lb_multi(lbs) fails = [i for i in ret if not i["result"]] if fails != []: message = "Some lbs install failed:%s" % \ ",".join(fails) logger.error(message) return False else: message = "All lbs install success:%s" % \ ",".join(lbs) logger.info(message) # 配置 lb. for lbinfo in lbinfos: lb = lbinfo["hostname"] internalip = lbinfo["internalip"] internalnetmask = lbinfo["internalnetmask"] internalgateway = lbinfo["internalgateway"] # 如果 _type 是 extra, 需要公网 IP; # 如果 _type 是 internal, 不需要公网 IP. extraip = lbinfo.get("extraip", None) extranetmask = lbinfo.get("extranetmask", None) extragateway = lbinfo.get("extragateway", None) # 配置 IP. ret = funcs.ip(lb, _type, device, internalip, internalnetmask, internalgateway, extraip, extranetmask, extragateway) if not ret: return False # 配置 lip. _lips = lips.get(internalip, internalnetmask) ret = funcs.lips(lb, internalip, _lips) if not ret: logger.error("Cfg lb lips failed:%s" % lb) return False logger.info("Cfg lb lips success:%s" % lb) # 保存集群信息. key = "cluster:%s" % name client.hset(key, "type", _type) client.hset(key, "lbinfos", lbinfos) client.hset(key, "vip2ws", vip2ws) client.hset(key, "vipnets", vipnets) client.hset(key, "device", device) logger.info("Cluster added:%s" % name) return True
def add(name, _type, lbinfos, vip2ws, vipnets, device): """ 增加一个 cluster. """ # 拿到 lb 信息. lbs = [i["hostname"] for i in lbinfos] if len(lbs) != len(set(lbs)): logger.error("Lb duplicates") return False # 拿到 vip 信息. vips = [i["vip"] for i in vip2ws] if len(vips) != len(set(vips)): logger.error("Vip duplicates") return False # 检查 name, lb 和 vip 是否不存在. check_dict = { "name": name, "lbs": lbs, "vips": vips, } if not funcs.check(check_dict, check_exist=False): logger.error("Cluster or lbs or vips has exists.") return False # 对所有 lb 安装 lvs fullnat. ret = funcs.lb_multi(lbs) fails = [ i for i in ret if not i["result"]] if fails != []: message = "Some lbs install failed:%s" % \ ",".join(fails) logger.error(message) return False else: message = "All lbs install success:%s" % \ ",".join(lbs) logger.info(message) # 配置 lb. for lbinfo in lbinfos: lb = lbinfo["hostname"] internalip = lbinfo["internalip"] internalnetmask = lbinfo["internalnetmask"] internalgateway = lbinfo["internalgateway"] # 如果 _type 是 extra, 需要公网 IP; # 如果 _type 是 internal, 不需要公网 IP. extraip = lbinfo.get("extraip", None) extranetmask = lbinfo.get("extranetmask", None) extragateway = lbinfo.get("extragateway", None) # 配置 IP. ret = funcs.ip(lb, _type, device, internalip, internalnetmask, internalgateway, extraip, extranetmask, extragateway) if not ret: return False # 配置 lip. _lips = lips.get(internalip, internalnetmask) ret = funcs.lips(lb, internalip, _lips) if not ret: logger.error("Cfg lb lips failed:%s" % lb) return False logger.info("Cfg lb lips success:%s" % lb) # 保存集群信息. key = "cluster:%s" % name client.hset(key, "type", _type) client.hset(key, "lbinfos", lbinfos) client.hset(key, "vip2ws", vip2ws) client.hset(key, "vipnets", vipnets) client.hset(key, "device", device) logger.info("Cluster added:%s" % name) return True
def add(name, new_lbinfos): """ 增加 lb. """ # 检查集群是否存在. checkdict = { "name": name, } if not funcs.check(checkdict, check_exist=True): logger.error("No cluster:%s" % name) return False # 获取新增 lb. new_lbs = [i["hostname"] for i in new_lbinfos] if len(new_lbs) != len(set(new_lbs)): logger.error("Lb duplicates") return False # 检查新增 lb 是否已经存在. checkdict = {"lbs": new_lbs} if not funcs.check(checkdict, check_exist=False): logger.error("Some lbs exist") return False # 对所有 lb 安装 lvs fullnat. ret = funcs.lb_multi(new_lbs) fails = [i for i in ret if not i["result"]] if fails != []: message = "Some lbs install failed:%s" % \ ",".join(fails) logger.error(message) return False message = "All lbs install success:%s" % \ ",".join(new_lbs) logger.info(message) # 获取已有集群信息. key = "cluster:%s" % name _type = client.hget(key, "type") old_lbinfos = eval(client.hget(key, "lbinfos")) device = client.hget(key, "device") # 获取新的 lbinfos. lbinfos = copy.deepcopy(old_lbinfos) lbinfos.extend(new_lbinfos) del old_lbinfos # 配置 lb. for lbinfo in new_lbinfos: lb = lbinfo["hostname"] internalip = lbinfo["internalip"] internalnetmask = lbinfo["internalnetmask"] internalgateway = lbinfo["internalgateway"] # 如果 _type 是 extra, 需要公网 IP; # 如果 _type 是 internal, 不需要公网 IP. extraip = lbinfo.get("extraip", None) extranetmask = lbinfo.get("extranetmask", None) extragateway = lbinfo.get("extragateway", None) # 配置 IP. ret = funcs.ip(lb, _type, device, internalip, internalnetmask, internalgateway, extraip, extranetmask, extragateway) if not ret: return False # 配置 lip. _lips = lips.get(internalip, internalnetmask) ret = funcs.lips(lb, internalip, _lips) if not ret: logger.error("Cfg lb lips failed:%s" % lb) return False logger.info("Cfg lb lips success:%s" % lb) # 保存集群信息. client.hset(key, "lbinfos", lbinfos) logger.info("Lbs added:%s" % ",".join(new_lbs)) return True