You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
103 lines
2.5 KiB
103 lines
2.5 KiB
2 years ago
|
package imds
|
||
|
|
||
|
import (
|
||
|
"context"
|
||
|
"encoding/json"
|
||
|
"fmt"
|
||
|
"io"
|
||
|
"strings"
|
||
|
"time"
|
||
|
|
||
|
"github.com/aws/smithy-go"
|
||
|
smithyio "github.com/aws/smithy-go/io"
|
||
|
"github.com/aws/smithy-go/middleware"
|
||
|
smithyhttp "github.com/aws/smithy-go/transport/http"
|
||
|
)
|
||
|
|
||
|
const getIAMInfoPath = getMetadataPath + "/iam/info"
|
||
|
|
||
|
// GetIAMInfo retrieves an identity document describing an
|
||
|
// instance. Error is returned if the request fails or is unable to parse
|
||
|
// the response.
|
||
|
func (c *Client) GetIAMInfo(
|
||
|
ctx context.Context, params *GetIAMInfoInput, optFns ...func(*Options),
|
||
|
) (
|
||
|
*GetIAMInfoOutput, error,
|
||
|
) {
|
||
|
if params == nil {
|
||
|
params = &GetIAMInfoInput{}
|
||
|
}
|
||
|
|
||
|
result, metadata, err := c.invokeOperation(ctx, "GetIAMInfo", params, optFns,
|
||
|
addGetIAMInfoMiddleware,
|
||
|
)
|
||
|
if err != nil {
|
||
|
return nil, err
|
||
|
}
|
||
|
|
||
|
out := result.(*GetIAMInfoOutput)
|
||
|
out.ResultMetadata = metadata
|
||
|
return out, nil
|
||
|
}
|
||
|
|
||
|
// GetIAMInfoInput provides the input parameters for GetIAMInfo operation.
|
||
|
type GetIAMInfoInput struct{}
|
||
|
|
||
|
// GetIAMInfoOutput provides the output parameters for GetIAMInfo operation.
|
||
|
type GetIAMInfoOutput struct {
|
||
|
IAMInfo
|
||
|
|
||
|
ResultMetadata middleware.Metadata
|
||
|
}
|
||
|
|
||
|
func addGetIAMInfoMiddleware(stack *middleware.Stack, options Options) error {
|
||
|
return addAPIRequestMiddleware(stack,
|
||
|
options,
|
||
|
buildGetIAMInfoPath,
|
||
|
buildGetIAMInfoOutput,
|
||
|
)
|
||
|
}
|
||
|
|
||
|
func buildGetIAMInfoPath(params interface{}) (string, error) {
|
||
|
return getIAMInfoPath, nil
|
||
|
}
|
||
|
|
||
|
func buildGetIAMInfoOutput(resp *smithyhttp.Response) (v interface{}, err error) {
|
||
|
defer func() {
|
||
|
closeErr := resp.Body.Close()
|
||
|
if err == nil {
|
||
|
err = closeErr
|
||
|
} else if closeErr != nil {
|
||
|
err = fmt.Errorf("response body close error: %v, original error: %w", closeErr, err)
|
||
|
}
|
||
|
}()
|
||
|
|
||
|
var buff [1024]byte
|
||
|
ringBuffer := smithyio.NewRingBuffer(buff[:])
|
||
|
body := io.TeeReader(resp.Body, ringBuffer)
|
||
|
|
||
|
imdsResult := &GetIAMInfoOutput{}
|
||
|
if err = json.NewDecoder(body).Decode(&imdsResult.IAMInfo); err != nil {
|
||
|
return nil, &smithy.DeserializationError{
|
||
|
Err: fmt.Errorf("failed to decode instance identity document, %w", err),
|
||
|
Snapshot: ringBuffer.Bytes(),
|
||
|
}
|
||
|
}
|
||
|
// Any code other success is an error
|
||
|
if !strings.EqualFold(imdsResult.Code, "success") {
|
||
|
return nil, fmt.Errorf("failed to get EC2 IMDS IAM info, %s",
|
||
|
imdsResult.Code)
|
||
|
}
|
||
|
|
||
|
return imdsResult, nil
|
||
|
}
|
||
|
|
||
|
// IAMInfo provides the shape for unmarshaling an IAM info from the metadata
|
||
|
// API.
|
||
|
type IAMInfo struct {
|
||
|
Code string
|
||
|
LastUpdated time.Time
|
||
|
InstanceProfileArn string
|
||
|
InstanceProfileID string
|
||
|
}
|