pkg/mock/userdata/userdata.go (53 lines of code) (raw):
// Copyright Amazon.com Inc. or its affiliates. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License"). You may
// not use this file except in compliance with the License. A copy of the
// License is located at
//
// http://aws.amazon.com/apache2.0/
//
// or in the "license" file accompanying this file. This file is distributed
// on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
// express or implied. See the License for the specific language governing
// permissions and limitations under the License.
package userdata
import (
"encoding/base64"
"fmt"
"log"
"net/http"
"reflect"
cfg "github.com/aws/amazon-ec2-metadata-mock/pkg/config"
"github.com/aws/amazon-ec2-metadata-mock/pkg/mock/imdsv2"
"github.com/aws/amazon-ec2-metadata-mock/pkg/server"
)
var (
supportedPaths = make(map[string]interface{})
response interface{}
// ServicePath defines the userdata service path
ServicePath = "/latest/user-data"
)
// Handler processes http requests
func Handler(res http.ResponseWriter, req *http.Request) {
log.Println("Received request to mock userdata:", req.URL.Path)
if val, ok := supportedPaths[req.URL.Path]; ok {
response = val
} else {
response = "Something went wrong with: " + req.URL.Path
}
server.FormatAndReturnOctetResponse(res, response.(string))
}
// RegisterHandlers registers handlers for userdata paths
func RegisterHandlers(config cfg.Config) {
pathValues := reflect.ValueOf(config.Userdata.Paths)
udValues := reflect.ValueOf(config.Userdata.Values)
// Iterate over fields in config.Userdata.Paths to
// determine intersections with config.Userdata.Values.
// Intersections represent which paths and values to bind.
for i := 0; i < pathValues.NumField(); i++ {
pathFieldName := pathValues.Type().Field(i).Name
udValueFieldName := udValues.FieldByName(pathFieldName)
if udValueFieldName.IsValid() {
path := pathValues.Field(i).Interface().(string)
value := udValueFieldName.Interface()
if path != "" && value != nil {
// Ex: "/latest/meta-data/instance-id" : "i-1234567890abcdef0"
bvalue, err := base64.StdEncoding.DecodeString(config.Userdata.Values.Userdata)
value = string(bvalue)
if err != nil {
fmt.Println("There was an issue decoding base64 data from config")
panic(err)
}
supportedPaths[path] = value
if config.Imdsv2Required {
server.HandleFunc(path, imdsv2.ValidateToken(Handler))
} else {
server.HandleFunc(path, Handler)
}
} else {
log.Printf("There was an issue registering path %v with udValue: %v", path, value)
}
}
}
}