func()

in internal/service/fetchsecret.go [9:49]


func (s *Server) FetchSecret(ctx context.Context, params *model.GetSecretParams) (string, error) {
	secretId := params.SecretID
	versionId := params.VersionID
	versionStage := params.VersionStage

	cacheKey := generateCacheKey(secretId, versionId, versionStage)
	cacheValue, err := s.cacheStore.Get(ctx, cacheKey)
	if err != nil {
		s.loggerWrapper.Warn("get secret[%s] from cache err:%v.", params.SecretID, err)
	}

	var cacheSecret interface{}
	var isExpired bool
	if cacheValue != nil {
		cacheSecret = cacheValue.(*cache.Item).GetValue()
		isExpired = cacheValue.(*cache.Item).CheckExpired()
	}

	if cacheSecret != nil && !isExpired {
		s.loggerWrapper.Info("get secret[%s] from cache success.", params.SecretID)
		return cacheSecret.(string), nil
	}

	kmsSecret, err := s.kmsClient.GetSecretInfo(ctx, secretId, versionId, versionStage)
	if err != nil {
		s.loggerWrapper.Error("get secret[%s] from kms error:%v", params.SecretID, err)
		// Ignore transient errors
		if s.IgnoreTransientErrors && cacheSecret != nil && isIgnoreTransientErrors(err) {
			s.loggerWrapper.Warn("get expired secret[%s] from cache.", params.SecretID)
			return cacheSecret.(string), nil
		}
		return "", err
	}
	s.loggerWrapper.Info("get secret[%s] from kms.", params.SecretID)

	err = s.cacheStore.Put(ctx, cacheKey, kmsSecret)
	if err != nil {
		s.loggerWrapper.Warn("put secret to cache err:%v", err)
	}
	return kmsSecret, nil
}