func (h *DesireAppHandler) createDesiredApp( logger lager.Logger, desireAppMessage cc_messages.DesireAppRequestFromCC, ) error { var builder recipebuilder.RecipeBuilder = h.recipeBuilders["buildpack"] if desireAppMessage.DockerImageUrl != "" { builder = h.recipeBuilders["docker"] } desiredLRP, err := builder.Build(&desireAppMessage) if err != nil { logger.Error("failed-to-build-recipe", err) return err } logger.Debug("creating-desired-lrp", lager.Data{"routes": sanitizeRoutes(desiredLRP.Routes)}) err = h.bbsClient.DesireLRP(desiredLRP) if err != nil { logger.Error("failed-to-create-lrp", err) return err } logger.Debug("created-desired-lrp") return nil }
func (h *DesireAppHandler) updateDesiredApp( logger lager.Logger, existingLRP *models.DesiredLRP, desireAppMessage cc_messages.DesireAppRequestFromCC, ) error { var builder recipebuilder.RecipeBuilder = h.recipeBuilders["buildpack"] if desireAppMessage.DockerImageUrl != "" { builder = h.recipeBuilders["docker"] } ports, err := builder.ExtractExposedPorts(&desireAppMessage) if err != nil { logger.Error("failed to-get-exposed-port", err) return err } updateRoutes, err := helpers.CCRouteInfoToRoutes(desireAppMessage.RoutingInfo, ports) if err != nil { logger.Error("failed-to-marshal-routes", err) return err } routes := existingLRP.Routes if routes == nil { routes = &models.Routes{} } if value, ok := updateRoutes[cfroutes.CF_ROUTER]; ok { (*routes)[cfroutes.CF_ROUTER] = value } if value, ok := updateRoutes[tcp_routes.TCP_ROUTER]; ok { (*routes)[tcp_routes.TCP_ROUTER] = value } instances := int32(desireAppMessage.NumInstances) updateRequest := &models.DesiredLRPUpdate{ Annotation: &desireAppMessage.ETag, Instances: &instances, Routes: routes, } logger.Debug("updating-desired-lrp", lager.Data{"routes": sanitizeRoutes(existingLRP.Routes)}) err = h.bbsClient.UpdateDesiredLRP(desireAppMessage.ProcessGuid, updateRequest) if err != nil { logger.Error("failed-to-update-lrp", err) return err } logger.Debug("updated-desired-lrp") return nil }
func (p *Processor) updateStaleDesiredLRPs( logger lager.Logger, cancel <-chan struct{}, stale <-chan []cc_messages.DesireAppRequestFromCC, existingSchedulingInfoMap map[string]*models.DesiredLRPSchedulingInfo, invalidCount *int32, ) <-chan error { logger = logger.Session("update-stale-desired-lrps") errc := make(chan error, 1) go func() { defer close(errc) for { var staleAppRequests []cc_messages.DesireAppRequestFromCC select { case <-cancel: return case selected, open := <-stale: if !open { return } staleAppRequests = selected } works := make([]func(), len(staleAppRequests)) for i, desireAppRequest := range staleAppRequests { desireAppRequest := desireAppRequest var builder recipebuilder.RecipeBuilder = p.builders["buildpack"] if desireAppRequest.DockerImageUrl != "" { builder = p.builders["docker"] } works[i] = func() { processGuid := desireAppRequest.ProcessGuid existingSchedulingInfo := existingSchedulingInfoMap[desireAppRequest.ProcessGuid] updateReq := &models.DesiredLRPUpdate{} instances := int32(desireAppRequest.NumInstances) updateReq.Instances = &instances updateReq.Annotation = &desireAppRequest.ETag exposedPorts, err := builder.ExtractExposedPorts(&desireAppRequest) if err != nil { logger.Error("failed-updating-stale-lrp", err, lager.Data{ "process-guid": processGuid, "execution-metadata": desireAppRequest.ExecutionMetadata, }) errc <- err return } routes, err := helpers.CCRouteInfoToRoutes(desireAppRequest.RoutingInfo, exposedPorts) if err != nil { logger.Error("failed-to-marshal-routes", err) errc <- err return } updateReq.Routes = &routes for k, v := range existingSchedulingInfo.Routes { if k != cfroutes.CF_ROUTER { (*updateReq.Routes)[k] = v } } logger.Debug("updating-stale-lrp", updateDesiredRequestDebugData(processGuid, updateReq)) err = p.bbsClient.UpdateDesiredLRP(processGuid, updateReq) if err != nil { logger.Error("failed-updating-stale-lrp", err, lager.Data{ "process-guid": processGuid, }) if models.ConvertError(err).Type == models.Error_InvalidRequest { atomic.AddInt32(invalidCount, int32(1)) } else { errc <- err } return } logger.Debug("succeeded-updating-stale-lrp", updateDesiredRequestDebugData(processGuid, updateReq)) } } throttler, err := workpool.NewThrottler(p.updateLRPWorkPoolSize, works) if err != nil { errc <- err return } logger.Info("processing-batch", lager.Data{"size": len(staleAppRequests)}) throttler.Work() logger.Info("done-processing-batch", lager.Data{"size": len(staleAppRequests)}) } }() return errc }
func (p *Processor) createMissingDesiredLRPs( logger lager.Logger, cancel <-chan struct{}, missing <-chan []cc_messages.DesireAppRequestFromCC, invalidCount *int32, ) <-chan error { logger = logger.Session("create-missing-desired-lrps") errc := make(chan error, 1) go func() { defer close(errc) for { var desireAppRequests []cc_messages.DesireAppRequestFromCC select { case <-cancel: return case selected, open := <-missing: if !open { return } desireAppRequests = selected } works := make([]func(), len(desireAppRequests)) for i, desireAppRequest := range desireAppRequests { desireAppRequest := desireAppRequest var builder recipebuilder.RecipeBuilder = p.builders["buildpack"] if desireAppRequest.DockerImageUrl != "" { builder = p.builders["docker"] } works[i] = func() { logger.Debug("building-create-desired-lrp-request", desireAppRequestDebugData(&desireAppRequest)) desired, err := builder.Build(&desireAppRequest) if err != nil { logger.Error("failed-building-create-desired-lrp-request", err, lager.Data{"process-guid": desireAppRequest.ProcessGuid}) errc <- err return } logger.Debug("succeeded-building-create-desired-lrp-request", desireAppRequestDebugData(&desireAppRequest)) logger.Debug("creating-desired-lrp", createDesiredReqDebugData(desired)) err = p.bbsClient.DesireLRP(desired) if err != nil { logger.Error("failed-creating-desired-lrp", err, lager.Data{"process-guid": desired.ProcessGuid}) if models.ConvertError(err).Type == models.Error_InvalidRequest { atomic.AddInt32(invalidCount, int32(1)) } else { errc <- err } return } logger.Debug("succeeded-creating-desired-lrp", createDesiredReqDebugData(desired)) } } throttler, err := workpool.NewThrottler(p.updateLRPWorkPoolSize, works) if err != nil { errc <- err return } logger.Info("processing-batch", lager.Data{"size": len(desireAppRequests)}) throttler.Work() logger.Info("done-processing-batch", lager.Data{"size": len(desireAppRequests)}) } }() return errc }