(w http.ResponseWriter, r *http.Request)
| 149 | } |
| 150 | |
| 151 | func (a *API) setConfig(w http.ResponseWriter, r *http.Request) { |
| 152 | userID, _, err := users.ExtractTenantIDFromHTTPRequest(r) |
| 153 | if err != nil { |
| 154 | http.Error(w, err.Error(), http.StatusUnauthorized) |
| 155 | return |
| 156 | } |
| 157 | logger := util_log.WithContext(r.Context(), util_log.Logger) |
| 158 | |
| 159 | var cfg userconfig.Config |
| 160 | switch parseConfigFormat(r.Header.Get("Content-Type"), FormatJSON) { |
| 161 | case FormatJSON: |
| 162 | if err := json.NewDecoder(r.Body).Decode(&cfg); err != nil { |
| 163 | // XXX: Untested |
| 164 | level.Error(logger).Log("msg", "error decoding json body", "err", err) |
| 165 | http.Error(w, err.Error(), http.StatusBadRequest) |
| 166 | return |
| 167 | } |
| 168 | case FormatYAML: |
| 169 | if err := yaml.NewDecoder(r.Body).Decode(&cfg); err != nil { |
| 170 | // XXX: Untested |
| 171 | level.Error(logger).Log("msg", "error decoding yaml body", "err", err) |
| 172 | http.Error(w, err.Error(), http.StatusBadRequest) |
| 173 | return |
| 174 | } |
| 175 | default: |
| 176 | // should never reach this point |
| 177 | level.Error(logger).Log("msg", "unexpected error detecting the config format") |
| 178 | http.Error(w, err.Error(), http.StatusInternalServerError) |
| 179 | return |
| 180 | } |
| 181 | |
| 182 | if err := validateAlertmanagerConfig(cfg.AlertmanagerConfig, a.cfg.Notifications); err != nil && cfg.AlertmanagerConfig != "" { |
| 183 | level.Error(logger).Log("msg", "invalid Alertmanager config", "err", err) |
| 184 | http.Error(w, fmt.Sprintf("Invalid Alertmanager config: %v", err), http.StatusBadRequest) |
| 185 | return |
| 186 | } |
| 187 | if err := validateRulesFiles(cfg, a.cfg.NameValidationScheme); err != nil { |
| 188 | level.Error(logger).Log("msg", "invalid rules", "err", err) |
| 189 | http.Error(w, fmt.Sprintf("Invalid rules: %v", err), http.StatusBadRequest) |
| 190 | return |
| 191 | } |
| 192 | if err := validateTemplateFiles(cfg); err != nil { |
| 193 | level.Error(logger).Log("msg", "invalid templates", "err", err) |
| 194 | http.Error(w, fmt.Sprintf("Invalid templates: %v", err), http.StatusBadRequest) |
| 195 | return |
| 196 | } |
| 197 | if err := a.db.SetConfig(r.Context(), userID, cfg); err != nil { |
| 198 | // XXX: Untested |
| 199 | level.Error(logger).Log("msg", "error storing config", "err", err) |
| 200 | http.Error(w, err.Error(), http.StatusInternalServerError) |
| 201 | return |
| 202 | } |
| 203 | w.WriteHeader(http.StatusNoContent) |
| 204 | } |
| 205 | |
| 206 | func (a *API) validateAlertmanagerConfig(w http.ResponseWriter, r *http.Request) { |
| 207 | logger := util_log.WithContext(r.Context(), util_log.Logger) |
nothing calls this directly
no test coverage detected