func bsConfigGetHandler(w http.ResponseWriter, r *http.Request, t auth.Token) error { currentConfig, err := bs.LoadConfig() if err != nil { if err != mgo.ErrNotFound { return err } currentConfig = &bs.Config{} } return json.NewEncoder(w).Encode(currentConfig) }
func bsEnvSetHandler(w http.ResponseWriter, r *http.Request, t auth.Token) error { var requestConfig bs.Config err := json.NewDecoder(r.Body).Decode(&requestConfig) if err != nil { return &errors.HTTP{ Code: http.StatusBadRequest, Message: fmt.Sprintf("unable to parse body as json: %s", err), } } if len(requestConfig.Envs) > 0 && !permission.Check(t, permission.PermNodeBs) { return permission.ErrUnauthorized } for _, poolEnv := range requestConfig.Pools { hasPermission := permission.Check(t, permission.PermNodeBs, permission.Context(permission.CtxPool, poolEnv.Name)) if !hasPermission { return permission.ErrUnauthorized } } currentConfig, err := bs.LoadConfig(nil) if err != nil { if err != mgo.ErrNotFound { return err } currentConfig = &bs.Config{} } envMap := bs.EnvMap{} poolEnvMap := bs.PoolEnvMap{} err = currentConfig.UpdateEnvMaps(envMap, poolEnvMap) if err != nil { return &errors.HTTP{ Code: http.StatusBadRequest, Message: err.Error(), } } err = requestConfig.UpdateEnvMaps(envMap, poolEnvMap) if err != nil { return &errors.HTTP{ Code: http.StatusBadRequest, Message: err.Error(), } } err = bs.SaveEnvs(envMap, poolEnvMap) if err != nil { return err } keepAliveWriter := tsuruIo.NewKeepAliveWriter(w, 15*time.Second, "") defer keepAliveWriter.Stop() writer := &tsuruIo.SimpleJsonMessageEncoderWriter{Encoder: json.NewEncoder(keepAliveWriter)} err = bs.RecreateContainers(mainDockerProvisioner, writer) if err != nil { writer.Encode(tsuruIo.SimpleJsonMessage{Error: err.Error()}) } return nil }
func bsConfigGetHandler(w http.ResponseWriter, r *http.Request, t auth.Token) error { pools, err := listContextValues(t, permission.PermNodeBs, true) if err != nil { return err } currentConfig, err := bs.LoadConfig(pools) if err != nil { return err } return json.NewEncoder(w).Encode(currentConfig) }
func (p *dockerProvisioner) LogsEnabled(app provision.App) (bool, string, error) { const ( logBackendsEnv = "LOG_BACKENDS" logDocKeyFormat = "LOG_%s_DOC" tsuruLogBackendName = "tsuru" ) logConf := container.DockerLog{} isBS, err := logConf.IsBS(app.GetPool()) if err != nil { return false, "", err } if !isBS { driver, _, _ := logConf.LogOpts(app.GetPool()) msg := fmt.Sprintf("Logs not available through tsuru. Enabled log driver is %q.", driver) return false, msg, nil } config, err := bs.LoadConfig([]string{app.GetPool()}) if err != nil { return false, "", err } enabledBackends := config.PoolEntry(app.GetPool(), logBackendsEnv) if enabledBackends == "" { return true, "", nil } backendsList := strings.Split(enabledBackends, ",") for i := range backendsList { backendsList[i] = strings.TrimSpace(backendsList[i]) if backendsList[i] == tsuruLogBackendName { return true, "", nil } } var docs []string for _, backendName := range backendsList { keyName := fmt.Sprintf(logDocKeyFormat, strings.ToUpper(backendName)) backendDoc := config.PoolEntry(app.GetPool(), keyName) var docLine string if backendDoc == "" { docLine = fmt.Sprintf("* %s", backendName) } else { docLine = fmt.Sprintf("* %s: %s", backendName, backendDoc) } docs = append(docs, docLine) } fullDoc := fmt.Sprintf("Logs not available through tsuru. Enabled log backends are:\n%s", strings.Join(docs, "\n")) return false, fullDoc, nil }
func bsEnvSetHandler(w http.ResponseWriter, r *http.Request, t auth.Token) error { var requestConfig bs.Config err := json.NewDecoder(r.Body).Decode(&requestConfig) if err != nil { return &errors.HTTP{ Code: http.StatusBadRequest, Message: fmt.Sprintf("unable to parse body as json: %s", err), } } currentConfig, err := bs.LoadConfig() if err != nil { if err != mgo.ErrNotFound { return err } currentConfig = &bs.Config{} } envMap := bs.EnvMap{} poolEnvMap := bs.PoolEnvMap{} err = currentConfig.UpdateEnvMaps(envMap, poolEnvMap) if err != nil { return &errors.HTTP{ Code: http.StatusBadRequest, Message: err.Error(), } } err = requestConfig.UpdateEnvMaps(envMap, poolEnvMap) if err != nil { return &errors.HTTP{ Code: http.StatusBadRequest, Message: err.Error(), } } err = bs.SaveEnvs(envMap, poolEnvMap) if err != nil { return err } keepAliveWriter := tsuruIo.NewKeepAliveWriter(w, 15*time.Second, "") defer keepAliveWriter.Stop() writer := &tsuruIo.SimpleJsonMessageEncoderWriter{Encoder: json.NewEncoder(keepAliveWriter)} err = bs.RecreateContainers(mainDockerProvisioner, writer) if err != nil { writer.Encode(tsuruIo.SimpleJsonMessage{Error: err.Error()}) } return nil }
func (p *dockerProvisioner) MetricEnvs(app provision.App) map[string]string { envMap := map[string]string{} bsConf, err := bs.LoadConfig() if err != nil { return envMap } envs, err := bsConf.EnvListForEndpoint("", app.GetPool()) if err != nil { return envMap } for _, env := range envs { if strings.HasPrefix(env, "METRICS_") { slice := strings.SplitN(env, "=", 2) envMap[slice[0]] = slice[1] } } return envMap }
func bsEnvSetHandler(w http.ResponseWriter, r *http.Request, t auth.Token) error { var requestConfig bs.Config err := json.NewDecoder(r.Body).Decode(&requestConfig) if err != nil { return &errors.HTTP{ Code: http.StatusBadRequest, Message: fmt.Sprintf("unable to parse body as json: %s", err), } } currentConfig, err := bs.LoadConfig() if err != nil { if err != mgo.ErrNotFound { return err } currentConfig = &bs.Config{} } envMap := bs.EnvMap{} poolEnvMap := bs.PoolEnvMap{} err = currentConfig.UpdateEnvMaps(envMap, poolEnvMap) if err != nil { return &errors.HTTP{ Code: http.StatusBadRequest, Message: err.Error(), } } err = requestConfig.UpdateEnvMaps(envMap, poolEnvMap) if err != nil { return &errors.HTTP{ Code: http.StatusBadRequest, Message: err.Error(), } } err = bs.SaveEnvs(envMap, poolEnvMap) if err != nil { return err } err = bs.RecreateContainers(mainDockerProvisioner) if err != nil { return err } w.WriteHeader(http.StatusNoContent) return nil }