src

Go monorepo.
git clone git://code.dwrz.net/src
Log | Files | Refs

api_op_GetIAMInfo.go (2543B)


      1 package imds
      2 
      3 import (
      4 	"context"
      5 	"encoding/json"
      6 	"fmt"
      7 	"io"
      8 	"strings"
      9 	"time"
     10 
     11 	"github.com/aws/smithy-go"
     12 	smithyio "github.com/aws/smithy-go/io"
     13 	"github.com/aws/smithy-go/middleware"
     14 	smithyhttp "github.com/aws/smithy-go/transport/http"
     15 )
     16 
     17 const getIAMInfoPath = getMetadataPath + "/iam/info"
     18 
     19 // GetIAMInfo retrieves an identity document describing an
     20 // instance. Error is returned if the request fails or is unable to parse
     21 // the response.
     22 func (c *Client) GetIAMInfo(
     23 	ctx context.Context, params *GetIAMInfoInput, optFns ...func(*Options),
     24 ) (
     25 	*GetIAMInfoOutput, error,
     26 ) {
     27 	if params == nil {
     28 		params = &GetIAMInfoInput{}
     29 	}
     30 
     31 	result, metadata, err := c.invokeOperation(ctx, "GetIAMInfo", params, optFns,
     32 		addGetIAMInfoMiddleware,
     33 	)
     34 	if err != nil {
     35 		return nil, err
     36 	}
     37 
     38 	out := result.(*GetIAMInfoOutput)
     39 	out.ResultMetadata = metadata
     40 	return out, nil
     41 }
     42 
     43 // GetIAMInfoInput provides the input parameters for GetIAMInfo operation.
     44 type GetIAMInfoInput struct{}
     45 
     46 // GetIAMInfoOutput provides the output parameters for GetIAMInfo operation.
     47 type GetIAMInfoOutput struct {
     48 	IAMInfo
     49 
     50 	ResultMetadata middleware.Metadata
     51 }
     52 
     53 func addGetIAMInfoMiddleware(stack *middleware.Stack, options Options) error {
     54 	return addAPIRequestMiddleware(stack,
     55 		options,
     56 		"GetIAMInfo",
     57 		buildGetIAMInfoPath,
     58 		buildGetIAMInfoOutput,
     59 	)
     60 }
     61 
     62 func buildGetIAMInfoPath(params interface{}) (string, error) {
     63 	return getIAMInfoPath, nil
     64 }
     65 
     66 func buildGetIAMInfoOutput(resp *smithyhttp.Response) (v interface{}, err error) {
     67 	defer func() {
     68 		closeErr := resp.Body.Close()
     69 		if err == nil {
     70 			err = closeErr
     71 		} else if closeErr != nil {
     72 			err = fmt.Errorf("response body close error: %v, original error: %w", closeErr, err)
     73 		}
     74 	}()
     75 
     76 	var buff [1024]byte
     77 	ringBuffer := smithyio.NewRingBuffer(buff[:])
     78 	body := io.TeeReader(resp.Body, ringBuffer)
     79 
     80 	imdsResult := &GetIAMInfoOutput{}
     81 	if err = json.NewDecoder(body).Decode(&imdsResult.IAMInfo); err != nil {
     82 		return nil, &smithy.DeserializationError{
     83 			Err:      fmt.Errorf("failed to decode instance identity document, %w", err),
     84 			Snapshot: ringBuffer.Bytes(),
     85 		}
     86 	}
     87 	// Any code other success is an error
     88 	if !strings.EqualFold(imdsResult.Code, "success") {
     89 		return nil, fmt.Errorf("failed to get EC2 IMDS IAM info, %s",
     90 			imdsResult.Code)
     91 	}
     92 
     93 	return imdsResult, nil
     94 }
     95 
     96 // IAMInfo provides the shape for unmarshaling an IAM info from the metadata
     97 // API.
     98 type IAMInfo struct {
     99 	Code               string
    100 	LastUpdated        time.Time
    101 	InstanceProfileArn string
    102 	InstanceProfileID  string
    103 }