1package imds
2
3import (
4	"context"
5	"encoding/json"
6	"fmt"
7	"io"
8	"time"
9
10	"github.com/aws/smithy-go"
11	smithyio "github.com/aws/smithy-go/io"
12	"github.com/aws/smithy-go/middleware"
13	smithyhttp "github.com/aws/smithy-go/transport/http"
14)
15
16const getInstanceIdentityDocumentPath = getDynamicDataPath + "/instance-identity/document"
17
18// GetInstanceIdentityDocument retrieves an identity document describing an
19// instance. Error is returned if the request fails or is unable to parse
20// the response.
21func (c *Client) GetInstanceIdentityDocument(
22	ctx context.Context, params *GetInstanceIdentityDocumentInput, optFns ...func(*Options),
23) (
24	*GetInstanceIdentityDocumentOutput, error,
25) {
26	if params == nil {
27		params = &GetInstanceIdentityDocumentInput{}
28	}
29
30	result, metadata, err := c.invokeOperation(ctx, "GetInstanceIdentityDocument", params, optFns,
31		addGetInstanceIdentityDocumentMiddleware,
32	)
33	if err != nil {
34		return nil, err
35	}
36
37	out := result.(*GetInstanceIdentityDocumentOutput)
38	out.ResultMetadata = metadata
39	return out, nil
40}
41
42// GetInstanceIdentityDocumentInput provides the input parameters for
43// GetInstanceIdentityDocument operation.
44type GetInstanceIdentityDocumentInput struct{}
45
46// GetInstanceIdentityDocumentOutput provides the output parameters for
47// GetInstanceIdentityDocument operation.
48type GetInstanceIdentityDocumentOutput struct {
49	InstanceIdentityDocument
50
51	ResultMetadata middleware.Metadata
52}
53
54func addGetInstanceIdentityDocumentMiddleware(stack *middleware.Stack, options Options) error {
55	return addAPIRequestMiddleware(stack,
56		options,
57		buildGetInstanceIdentityDocumentPath,
58		buildGetInstanceIdentityDocumentOutput,
59	)
60}
61
62func buildGetInstanceIdentityDocumentPath(params interface{}) (string, error) {
63	return getInstanceIdentityDocumentPath, nil
64}
65
66func buildGetInstanceIdentityDocumentOutput(resp *smithyhttp.Response) (interface{}, error) {
67	defer resp.Body.Close()
68
69	var buff [1024]byte
70	ringBuffer := smithyio.NewRingBuffer(buff[:])
71	body := io.TeeReader(resp.Body, ringBuffer)
72
73	output := &GetInstanceIdentityDocumentOutput{}
74	if err := json.NewDecoder(body).Decode(&output.InstanceIdentityDocument); err != nil {
75		return nil, &smithy.DeserializationError{
76			Err:      fmt.Errorf("failed to decode instance identity document, %w", err),
77			Snapshot: ringBuffer.Bytes(),
78		}
79	}
80
81	return output, nil
82}
83
84// InstanceIdentityDocument provides the shape for unmarshaling
85// an instance identity document
86type InstanceIdentityDocument struct {
87	DevpayProductCodes      []string  `json:"devpayProductCodes"`
88	MarketplaceProductCodes []string  `json:"marketplaceProductCodes"`
89	AvailabilityZone        string    `json:"availabilityZone"`
90	PrivateIP               string    `json:"privateIp"`
91	Version                 string    `json:"version"`
92	Region                  string    `json:"region"`
93	InstanceID              string    `json:"instanceId"`
94	BillingProducts         []string  `json:"billingProducts"`
95	InstanceType            string    `json:"instanceType"`
96	AccountID               string    `json:"accountId"`
97	PendingTime             time.Time `json:"pendingTime"`
98	ImageID                 string    `json:"imageId"`
99	KernelID                string    `json:"kernelId"`
100	RamdiskID               string    `json:"ramdiskId"`
101	Architecture            string    `json:"architecture"`
102}
103