func (this *IPPoolController) ListUsed() { ipPool := core.NewIpPool() ips, err := ipPool.ListUsedIP(-1) if err != nil { WriteJson(this.Ctx, &StatusError{Error: err.Error()}) return } WriteJson(this.Ctx, ips) }
func (this *IPPoolController) Release() { id, err := strconv.Atoi(this.Ctx.Input.Param(":id")) if err != nil { WriteJson(this.Ctx, &StatusError{Error: err.Error()}) return } ipPool := core.NewIpPool() err = ipPool.ReleaseIP(int64(id)) if err != nil { WriteJson(this.Ctx, &StatusError{Error: err.Error()}) return } }
func (this *IPPoolController) Create() { ip := &core.Ip{} err := json.Unmarshal(this.Ctx.Input.RequestBody, ip) if err != nil { fmt.Println(err) WriteJson(this.Ctx, &StatusError{Error: err.Error()}) return } //re := regexp.MustCompile("^\\d+\\.\\d+\\.\\d+\\.\\d+$") re := regexp.MustCompile("^\\d+\\.\\d+\\.\\d+\\.\\d+/\\d+@\\d+\\.\\d+\\.\\d+\\.\\d+$") if !re.MatchString(ip.Ip) { WriteJson(this.Ctx, &StatusError{Error: "bad format"}) return } ipPool := core.NewIpPool() ip, err = ipPool.AddIP(ip) if err != nil { WriteJson(this.Ctx, &StatusError{Error: err.Error()}) return } WriteJson(this.Ctx, ip) }
func init() { DockerClient = dockerd_engine1.NewDockerClient() Scheduler = mcscheduler.NewScheduler() IPPool = core.NewIpPool() }
//Reviewed at 20150702 func dockerdCallbackFunc(dockerd *core.Dockerd, status int, args ...interface{}) { ippool := core.NewIpPool() var ip *core.Ip var err error switch status { case dockerdengine.STATUS_ON_CREATE_SUCCESSED: case dockerdengine.STATUS_ON_CREATE_FAILED: case dockerdengine.STATUS_ON_RUN_SUCCESSED: /* 参考: models/dockerengine/engine1/container.go DockerEngine给回调函数传入的第一个参数,是*core.Unit。这个行为取决于各个Engine的实现,请大家遵守。 如果不遵守,需要修改本回调函数逻辑。 代码逻辑:Run container -> 分配IP -> 把IP提交到前端分发器 */ unit := args[0].(*core.Unit) /* 从ip池获取可以分配给container的IP。 注意,这里不是dockerd宿主机的IP。是container的IP。 因为container采用独立IP桥接模式。 尚未做NAT网络支持。我也觉得独立桥接比NAT好。 */ ip, err = ippool.GetFreeIP() if err != nil { beego.Error("Cannot get free IP at ", dockerd.GetIP(), " :", err) return } //通过 ssh client 调用pipework duangcfg, err := config.NewConfig("ini", "conf/duang.conf") if err != nil { beego.Error(err) ippool.ReleaseIP(ip.Id) return } var sshclient sshclientengine.SshClientInterface //通过密钥对访问ssh服务器,也就是dockerd所在的服务器,也就是宿主机。 sshclient, err = sshclientengine1.NewSSLClient(fmt.Sprintf("%s:%s", dockerd.GetIP(), duangcfg.String("ssh_port")), duangcfg.String("ssh_user"), duangcfg.String("ssh_keypath")) if err != nil { ippool.ReleaseIP(ip.Id) return } //pipework br0 containerName 192.168.0.0/[email protected] cmd := fmt.Sprintf("%s %s %s %s", duangcfg.String("pipework_path"), duangcfg.String("pipework_bridge"), unit.Name, ip.Ip) err = sshclient.Run(cmd) if err != nil { ippool.ReleaseIP(ip.Id) return } //调用前端分发器,把container IP分发到 confd+HAProxy var deliverEngine deliverengine.DeliverInterface deliverEngine = deliver_engine1.NewDeliver() //解析出Unit参数中的前端分发器参数。 for _, para := range unit.Parameteres { if para.Type == "d" { re := regexp.MustCompile("^(\\d+):(\\d+)$") result := re.FindStringSubmatch(para.Value) fPort := result[1] bPort := result[2] err = deliverEngine.Bind(fmt.Sprintf("0.0.0.0:%s", fPort), unit.Domain, fmt.Sprintf("%s:%s", ip.GetIP(), bPort)) if err != nil { beego.Error(err) } } } case dockerdengine.STATUS_ON_RUN_FAILED: } }