code.dwrz.net

Go monorepo.
Log | Files | Refs

api_op_GetIAMInfo.go (2527B)


      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 		buildGetIAMInfoPath,
     57 		buildGetIAMInfoOutput,
     58 	)
     59 }
     60 
     61 func buildGetIAMInfoPath(params interface{}) (string, error) {
     62 	return getIAMInfoPath, nil
     63 }
     64 
     65 func buildGetIAMInfoOutput(resp *smithyhttp.Response) (v interface{}, err error) {
     66 	defer func() {
     67 		closeErr := resp.Body.Close()
     68 		if err == nil {
     69 			err = closeErr
     70 		} else if closeErr != nil {
     71 			err = fmt.Errorf("response body close error: %v, original error: %w", closeErr, err)
     72 		}
     73 	}()
     74 
     75 	var buff [1024]byte
     76 	ringBuffer := smithyio.NewRingBuffer(buff[:])
     77 	body := io.TeeReader(resp.Body, ringBuffer)
     78 
     79 	imdsResult := &GetIAMInfoOutput{}
     80 	if err = json.NewDecoder(body).Decode(&imdsResult.IAMInfo); err != nil {
     81 		return nil, &smithy.DeserializationError{
     82 			Err:      fmt.Errorf("failed to decode instance identity document, %w", err),
     83 			Snapshot: ringBuffer.Bytes(),
     84 		}
     85 	}
     86 	// Any code other success is an error
     87 	if !strings.EqualFold(imdsResult.Code, "success") {
     88 		return nil, fmt.Errorf("failed to get EC2 IMDS IAM info, %s",
     89 			imdsResult.Code)
     90 	}
     91 
     92 	return imdsResult, nil
     93 }
     94 
     95 // IAMInfo provides the shape for unmarshaling an IAM info from the metadata
     96 // API.
     97 type IAMInfo struct {
     98 	Code               string
     99 	LastUpdated        time.Time
    100 	InstanceProfileArn string
    101 	InstanceProfileID  string
    102 }