func AppResources(rw http.ResponseWriter, r *http.Request) { log := appsLogger("resources").Start() app := mux.Vars(r)["app"] resources, err := models.ListResources(app) if err != nil { helpers.Error(log, err) RenderError(rw, err) return } RenderPartial(rw, "app", "resources", resources) }
func BuildCreate(rw http.ResponseWriter, r *http.Request) { log := buildsLogger("create").Start() build := models.NewBuild(mux.Vars(r)["app"]) err := r.ParseMultipartForm(50 * 1024 * 1024) logEvent(log, build, "ParseMultipartForm", err) if err != nil { helpers.Error(log, err) RenderError(rw, err) return } err = build.Save() logEvent(log, build, "Save", err) if err != nil { helpers.Error(log, err) RenderError(rw, err) return } source, _, err := r.FormFile("source") logEvent(log, build, "FormFile", err) if err != nil && err != http.ErrMissingFile { helpers.Error(log, err) RenderError(rw, err) return } resources, err := models.ListResources(os.Getenv("RACK")) logEvent(log, build, "ListResources", err) if err != nil { helpers.Error(log, err) RenderError(rw, err) return } err = models.S3PutFile(resources["RegistryBucket"].Id, fmt.Sprintf("builds/%s.tgz", build.Id), source, false) logEvent(log, build, "S3Put", err) if err != nil { helpers.Error(log, err) RenderError(rw, err) return } ch := make(chan error) if source != nil { go build.ExecuteLocal(source, ch) err = <-ch logEvent(log, build, "ExecuteLocal", err) if err != nil { RenderError(rw, err) } else { RenderText(rw, build.Id) } return } if err == http.ErrMissingFile { if repo := r.FormValue("repo"); repo != "" { go build.ExecuteRemote(repo, ch) err = <-ch logEvent(log, build, "ExecuteRemote", err) if err != nil { RenderError(rw, err) } else { RenderText(rw, build.Id) } return } } err = fmt.Errorf("no source or repo") helpers.Error(log, err) RenderError(rw, err) }
func startClusterMonitor() { var log = logger.New("ns=cluster_monitor") Tick: for _ = range time.Tick(5 * time.Minute) { log.Log("tick") // Ger Rack InstanceCount Parameter instanceCount := 0 res, err := models.CloudFormation().DescribeStacks( &cloudformation.DescribeStacksInput{ StackName: aws.String(os.Getenv("RACK")), }, ) if err != nil { log.Error(err) continue } for _, p := range res.Stacks[0].Parameters { if *p.ParameterKey == "InstanceCount" { c, err := strconv.Atoi(*p.ParameterValue) if err != nil { log.Error(err) break Tick } instanceCount = c break } } // List and Describe ECS Container Instances ires, err := models.ECS().ListContainerInstances( &ecs.ListContainerInstancesInput{ Cluster: aws.String(os.Getenv("CLUSTER")), }, ) if err != nil { log.Error(err) continue } dres, err := models.ECS().DescribeContainerInstances( &ecs.DescribeContainerInstancesInput{ Cluster: aws.String(os.Getenv("CLUSTER")), ContainerInstances: ires.ContainerInstanceARNs, }, ) if err != nil { log.Error(err) continue } cInstanceIds := make([]string, 0) cInstanceConnections := make(map[string]bool) for _, i := range dres.ContainerInstances { cInstanceConnections[*i.EC2InstanceID] = *i.AgentConnected if *i.AgentConnected { cInstanceIds = append(cInstanceIds, *i.EC2InstanceID) } } // Get and Describe Rack ASG Resource resources, err := models.ListResources(os.Getenv("RACK")) ares, err := models.AutoScaling().DescribeAutoScalingGroups( &autoscaling.DescribeAutoScalingGroupsInput{ AutoScalingGroupNames: []*string{ aws.String(resources["Instances"].Id), }, }, ) if err != nil { log.Error(err) continue } // Test if ASG Instance is registered and connected in ECS cluster aInstanceIds := []string{} uInstanceIds := []string{} for _, i := range ares.AutoScalingGroups[0].Instances { if connected, exists := cInstanceConnections[*i.InstanceID]; connected && exists { aInstanceIds = append(aInstanceIds, *i.InstanceID) } else { // Not registered or not connected => set Unhealthy if *i.LifecycleState == "InService" { _, err := models.AutoScaling().SetInstanceHealth( &autoscaling.SetInstanceHealthInput{ HealthStatus: aws.String("Unhealthy"), InstanceID: aws.String(*i.InstanceID), ShouldRespectGracePeriod: aws.Boolean(true), }, ) if err != nil { log.Error(err) continue } uInstanceIds = append(uInstanceIds, *i.InstanceID) } } } sort.Strings(aInstanceIds) sort.Strings(cInstanceIds) sort.Strings(uInstanceIds) log.Log("InstanceCount=%v connected='%v' healthy='%v' marked='%s'", instanceCount, strings.Join(cInstanceIds, ","), strings.Join(aInstanceIds, ","), strings.Join(uInstanceIds, ",")) } }