func (a *HostAgent) setProxy(svc *service.Service, ctr *docker.Container) { glog.V(4).Infof("Looking for address assignment in service %s (%s)", svc.Name, svc.ID) for _, endpoint := range svc.Endpoints { if addressConfig := endpoint.GetAssignment(); addressConfig != nil { glog.V(4).Infof("Found address assignment for %s: %s endpoint %s", svc.Name, svc.ID, endpoint.Name) frontendAddress := iptables.NewAddress(addressConfig.IPAddr, int(addressConfig.Port)) backendAddress := iptables.NewAddress(ctr.NetworkSettings.IPAddress, int(endpoint.PortNumber)) if err := a.servicedChain.Forward(iptables.Add, endpoint.Protocol, frontendAddress, backendAddress); err != nil { glog.Warningf("Could not start external address proxy for %s:%s: %s", svc.ID, endpoint.Name, err) } defer func() { if err := a.servicedChain.Forward(iptables.Delete, endpoint.Protocol, frontendAddress, backendAddress); err != nil { glog.Warningf("Could not remove external address proxy for %s:%s: %s", svc.ID, endpoint.Name, err) } }() } } ctr.Wait(time.Hour * 24 * 365) }
func (a *HostAgent) removeInstance(stateID string, ctr *docker.Container) { rc, err := ctr.Wait(time.Second) if err != nil || rc != 0 || glog.GetVerbosity() > 0 { // TODO: output of docker logs is potentially very large // this should be implemented another way, perhaps a docker attach // or extend docker to give last N seconds if output, err := exec.Command("docker", "logs", "--tail", "10000", ctr.ID).CombinedOutput(); err != nil { glog.Errorf("Could not get logs for container %s", ctr.ID) } else { glog.Warningf("Last 10000 lines of container %s:\n %s", ctr.ID, string(output)) } } if ctr.IsRunning() { glog.Errorf("Instance %s (%s) is still running, killing container") ctr.Kill() } if err := ctr.Delete(true); err != nil { glog.Errorf("Could not remove instance %s (%s): %s", stateID, ctr.ID, err) } glog.Infof("Service state %s (%s) receieved exit code %d", stateID, ctr.ID, rc) }