func()

in provider/parameter_store_provider.go [106:185]


func (p *ParameterStoreProvider) fetchParameterStoreBatch(
	client ParameterStoreClient,
	ctx context.Context,
	batchDescriptors []*SecretDescriptor,
	curMap map[string]*v1alpha1.ObjectVersion,
) (v []*SecretValue, err error) {

	var values []*SecretValue

	// Build up the batch of parameter names.
	var names []*string
	batchDesc := make(map[string]*SecretDescriptor)
	for _, descriptor := range batchDescriptors {

		// Use either version or label if specified (but not both)
		parameterName := descriptor.GetSecretName(client.IsFailover)
		if len(descriptor.GetObjectVersion(client.IsFailover)) != 0 {
			parameterName = fmt.Sprintf("%s:%s", parameterName, descriptor.GetObjectVersion(client.IsFailover))
		} else if len(descriptor.GetObjectVersionLabel(client.IsFailover)) != 0 {
			parameterName = fmt.Sprintf("%s:%s", parameterName, descriptor.GetObjectVersionLabel(client.IsFailover))
		}

		names = append(names, aws.String(parameterName))
		batchDesc[descriptor.GetSecretName(client.IsFailover)] = descriptor // Needed for response
	}

	// Fetch the batch of secrets
	rsp, err := client.Client.GetParametersWithContext(ctx, &ssm.GetParametersInput{
		Names:          names,
		WithDecryption: aws.Bool(true),
	})
	if err != nil {
		return nil, fmt.Errorf("%s: Failed fetching parameters: %w", client.Region, err)
	}

	if len(rsp.InvalidParameters) != 0 {
		err = awserr.NewRequestFailure(awserr.New("", fmt.Sprintf("%s: Invalid parameters: %s", client.Region, strings.Join(aws.StringValueSlice(rsp.InvalidParameters), ", ")), err), 400, "")
		return nil, err
	}

	// Build up the results from the batch
	for _, parm := range rsp.Parameters {

		// SecretDescriptor key is either Name or ARN.
		descriptor := batchDesc[*(parm.Name)]
		if descriptor == nil {
			descriptor = batchDesc[*(parm.ARN)]
		}

		secretValue := &SecretValue{
			Value:      []byte(*(parm.Value)),
			Descriptor: *descriptor,
		}
		values = append(values, secretValue)

		//Fetch individual json key value pairs if jmesPath is specified
		jsonSecrets, jsonErr := secretValue.getJsonSecrets()
		if jsonErr != nil {
			return nil, fmt.Errorf("%s: %s", client.Region, jsonErr)
		}

		values = append(values, jsonSecrets...)

		// Update the version in the current version map.
		for _, jsonSecret := range jsonSecrets {
			jsonDescriptor := jsonSecret.Descriptor
			curMap[jsonDescriptor.GetFileName()] = &v1alpha1.ObjectVersion{
				Id:      jsonDescriptor.GetFileName(),
				Version: strconv.Itoa(int(*(parm.Version))),
			}
		}

		curMap[descriptor.GetFileName()] = &v1alpha1.ObjectVersion{
			Id:      descriptor.GetFileName(),
			Version: strconv.Itoa(int(*(parm.Version))),
		}
	}

	return values, nil
}