Example #1
0
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)
}
Example #2
0
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
	}
}
Example #3
0
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)
}
Example #4
0
func init() {
	DockerClient = dockerd_engine1.NewDockerClient()
	Scheduler = mcscheduler.NewScheduler()
	IPPool = core.NewIpPool()
}
Example #5
0
//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:
	}
}