func()

in cli/silence_update.go [55:138]


func (c *silenceUpdateCmd) update(ctx context.Context, _ *kingpin.ParseContext) error {
	if len(c.ids) < 1 {
		return fmt.Errorf("no silence IDs specified")
	}

	amclient := NewAlertmanagerClient(alertmanagerURL)

	var updatedSilences []models.GettableSilence
	for _, silenceID := range c.ids {
		params := silence.NewGetSilenceParams()
		params.SilenceID = strfmt.UUID(silenceID)
		response, err := amclient.Silence.GetSilence(params)
		if err != nil {
			return err
		}
		sil := response.Payload
		if c.start != "" {
			startsAtTime, err := time.Parse(time.RFC3339, c.start)
			if err != nil {
				return err
			}
			startsAt := strfmt.DateTime(startsAtTime)
			sil.StartsAt = &startsAt
		}

		if c.end != "" {
			endsAtTime, err := time.Parse(time.RFC3339, c.end)
			if err != nil {
				return err
			}
			endsAt := strfmt.DateTime(endsAtTime)
			sil.EndsAt = &endsAt
		} else if c.duration != "" {
			d, err := model.ParseDuration(c.duration)
			if err != nil {
				return err
			}
			if d == 0 {
				return fmt.Errorf("silence duration must be greater than 0")
			}
			endsAt := strfmt.DateTime(time.Time(*sil.StartsAt).UTC().Add(time.Duration(d)))
			sil.EndsAt = &endsAt
		}

		if time.Time(*sil.StartsAt).After(time.Time(*sil.EndsAt)) {
			return errors.New("silence cannot start after it ends")
		}

		if c.comment != "" {
			sil.Comment = &c.comment
		}

		ps := &models.PostableSilence{
			ID:      *sil.ID,
			Silence: sil.Silence,
		}

		amclient := NewAlertmanagerClient(alertmanagerURL)

		silenceParams := silence.NewPostSilencesParams().WithContext(ctx).WithSilence(ps)
		postOk, err := amclient.Silence.PostSilences(silenceParams)
		if err != nil {
			return err
		}

		sil.ID = &postOk.Payload.SilenceID
		updatedSilences = append(updatedSilences, *sil)
	}

	if c.quiet {
		for _, silence := range updatedSilences {
			fmt.Println(silence.ID)
		}
	} else {
		formatter, found := format.Formatters[output]
		if !found {
			return fmt.Errorf("unknown output formatter")
		}
		if err := formatter.FormatSilences(updatedSilences); err != nil {
			return fmt.Errorf("error formatting silences: %w", err)
		}
	}
	return nil
}