mirror of https://github.com/kubernetes/kops.git
Merge pull request #5553 from mikesplain/machine_type_generator
Machine type generator
This commit is contained in:
commit
d81ab2acba
|
@ -107,7 +107,7 @@
|
|||
version = "v9"
|
||||
|
||||
[[projects]]
|
||||
digest = "1:f2bce9137130ed14d0b50a8ba5cef3b9d8829c304c97d164eb35421644cc746e"
|
||||
digest = "1:9b9aa0e8cd09203c6f105eeccb15da48c707d4827d21810dfe6bd718935f917e"
|
||||
name = "github.com/aws/aws-sdk-go"
|
||||
packages = [
|
||||
"aws",
|
||||
|
@ -150,6 +150,7 @@
|
|||
"service/iam",
|
||||
"service/iam/iamiface",
|
||||
"service/kms",
|
||||
"service/pricing",
|
||||
"service/route53",
|
||||
"service/route53/route53iface",
|
||||
"service/s3",
|
||||
|
@ -2121,6 +2122,7 @@
|
|||
"github.com/aws/aws-sdk-go/service/elb/elbiface",
|
||||
"github.com/aws/aws-sdk-go/service/iam",
|
||||
"github.com/aws/aws-sdk-go/service/iam/iamiface",
|
||||
"github.com/aws/aws-sdk-go/service/pricing",
|
||||
"github.com/aws/aws-sdk-go/service/route53",
|
||||
"github.com/aws/aws-sdk-go/service/route53/route53iface",
|
||||
"github.com/aws/aws-sdk-go/service/s3",
|
||||
|
|
6
Makefile
6
Makefile
|
@ -768,3 +768,9 @@ bazel-version-dist: bazel-crossbuild-nodeup bazel-crossbuild-kops bazel-protokub
|
|||
.PHONY: bazel-upload
|
||||
bazel-upload: bazel-version-dist # Upload kops to S3
|
||||
aws s3 sync --acl public-read ${BAZELUPLOAD}/ ${S3_BUCKET}
|
||||
|
||||
.PHONY: update-machine-types
|
||||
update-machine-types: #Update machine_types.go
|
||||
go build -o hack/machine_types/machine_types ${KOPS_ROOT}/hack/machine_types/machine_types.go
|
||||
hack/machine_types/machine_types
|
||||
go fmt upup/pkg/fi/cloudup/awsup/machine_types.go
|
||||
|
|
|
@ -28,6 +28,7 @@ k8s.io/kops/dnsprovider/pkg/dnsprovider/providers/google/clouddns/internal/stubs
|
|||
k8s.io/kops/dnsprovider/pkg/dnsprovider/rrstype
|
||||
k8s.io/kops/dnsprovider/pkg/dnsprovider/tests
|
||||
k8s.io/kops/examples/kops-api-example
|
||||
k8s.io/kops/hack/machine_types
|
||||
k8s.io/kops/kube-discovery/cmd/kube-discovery
|
||||
k8s.io/kops/node-authorizer/cmd/node-authorizer
|
||||
k8s.io/kops/node-authorizer/pkg/authorizers/alwaysallow
|
||||
|
|
|
@ -0,0 +1 @@
|
|||
machine_types
|
|
@ -0,0 +1,22 @@
|
|||
load("@io_bazel_rules_go//go:def.bzl", "go_binary", "go_library")
|
||||
|
||||
go_library(
|
||||
name = "go_default_library",
|
||||
srcs = ["machine_types.go"],
|
||||
importpath = "k8s.io/kops/hack/machine_types",
|
||||
visibility = ["//visibility:private"],
|
||||
deps = [
|
||||
"//upup/pkg/fi/cloudup/awsup:go_default_library",
|
||||
"//vendor/github.com/aws/aws-sdk-go/aws:go_default_library",
|
||||
"//vendor/github.com/aws/aws-sdk-go/aws/awserr:go_default_library",
|
||||
"//vendor/github.com/aws/aws-sdk-go/aws/session:go_default_library",
|
||||
"//vendor/github.com/aws/aws-sdk-go/service/pricing:go_default_library",
|
||||
"//vendor/github.com/golang/glog:go_default_library",
|
||||
],
|
||||
)
|
||||
|
||||
go_binary(
|
||||
name = "machinetypes",
|
||||
embed = [":go_default_library"],
|
||||
visibility = ["//visibility:public"],
|
||||
)
|
|
@ -0,0 +1,19 @@
|
|||
Machine Types Generator
|
||||
=======================
|
||||
|
||||
To prevent errors or lagging updates, we use this generator to update the known aws machine types
|
||||
that are [hard coded in kops](https://github.com/kubernetes/kops/blob/7d7112c1e9a52d4f677db6bd98943d308ec9f581/upup/pkg/fi/cloudup/awsup/machine_types.go#L76).
|
||||
|
||||
This generator uses the AWS Pricing API to get most of it's info on what instance types are supported.
|
||||
|
||||
Usage
|
||||
-----
|
||||
```
|
||||
make update-machine-types
|
||||
git add .
|
||||
git commit -am "Updated machine types"
|
||||
```
|
||||
|
||||
TODO:
|
||||
-----
|
||||
* Cross reference other regions besides us-east-1. Currently we just look at one region to determine instance types.
|
|
@ -0,0 +1,278 @@
|
|||
/*
|
||||
Copyright 2018 The Kubernetes Authors.
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License 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 main
|
||||
|
||||
import (
|
||||
"bufio"
|
||||
"bytes"
|
||||
"flag"
|
||||
"fmt"
|
||||
"io/ioutil"
|
||||
"log"
|
||||
"os"
|
||||
"path/filepath"
|
||||
"sort"
|
||||
"strconv"
|
||||
"strings"
|
||||
|
||||
"github.com/aws/aws-sdk-go/aws"
|
||||
"github.com/aws/aws-sdk-go/aws/awserr"
|
||||
"github.com/aws/aws-sdk-go/aws/session"
|
||||
"github.com/aws/aws-sdk-go/service/pricing"
|
||||
"github.com/golang/glog"
|
||||
"k8s.io/kops/upup/pkg/fi/cloudup/awsup"
|
||||
)
|
||||
|
||||
func init() {
|
||||
flag.Parse()
|
||||
flag.Lookup("logtostderr").Value.Set("true")
|
||||
}
|
||||
|
||||
func main() {
|
||||
|
||||
glog.Info("Beginning AWS Machine Refresh")
|
||||
|
||||
// Not currently in the API
|
||||
t2CreditsPerHour := map[string]float32{
|
||||
"t1.micro": 1,
|
||||
"t2.nano": 3,
|
||||
"t2.micro": 6,
|
||||
"t2.small": 12,
|
||||
"t2.medium": 24,
|
||||
"t2.large": 36,
|
||||
"t2.xlarge": 54,
|
||||
"t2.2xlarge": 81,
|
||||
}
|
||||
|
||||
machines := []awsup.AWSMachineTypeInfo{}
|
||||
families := make(map[string]struct{})
|
||||
|
||||
prices := []aws.JSONValue{}
|
||||
|
||||
svc := pricing.New(session.New(), aws.NewConfig().WithRegion("us-east-1"))
|
||||
typeTerm := pricing.FilterTypeTermMatch
|
||||
input := &pricing.GetProductsInput{
|
||||
Filters: []*pricing.Filter{
|
||||
{
|
||||
Field: aws.String("operatingSystem"),
|
||||
Type: &typeTerm,
|
||||
Value: aws.String("Linux"),
|
||||
},
|
||||
{
|
||||
Field: aws.String("tenancy"),
|
||||
Type: &typeTerm,
|
||||
Value: aws.String("shared"),
|
||||
},
|
||||
{
|
||||
Field: aws.String("location"),
|
||||
Type: &typeTerm,
|
||||
Value: aws.String("US East (N. Virginia)"),
|
||||
},
|
||||
{
|
||||
Field: aws.String("preInstalledSw"),
|
||||
Type: &typeTerm,
|
||||
Value: aws.String("NA"),
|
||||
},
|
||||
},
|
||||
FormatVersion: aws.String("aws_v1"),
|
||||
ServiceCode: aws.String("AmazonEC2"),
|
||||
}
|
||||
|
||||
for {
|
||||
result, err := svc.GetProducts(input)
|
||||
|
||||
if err != nil {
|
||||
if aerr, ok := err.(awserr.Error); ok {
|
||||
switch aerr.Code() {
|
||||
case pricing.ErrCodeInternalErrorException:
|
||||
glog.Errorf(pricing.ErrCodeInternalErrorException, aerr.Error())
|
||||
case pricing.ErrCodeInvalidParameterException:
|
||||
glog.Errorf(pricing.ErrCodeInvalidParameterException, aerr.Error())
|
||||
case pricing.ErrCodeNotFoundException:
|
||||
glog.Errorf(pricing.ErrCodeNotFoundException, aerr.Error())
|
||||
case pricing.ErrCodeInvalidNextTokenException:
|
||||
glog.Errorf(pricing.ErrCodeInvalidNextTokenException, aerr.Error())
|
||||
case pricing.ErrCodeExpiredNextTokenException:
|
||||
glog.Errorf(pricing.ErrCodeExpiredNextTokenException, aerr.Error())
|
||||
default:
|
||||
glog.Errorf(aerr.Error())
|
||||
}
|
||||
} else {
|
||||
// Print the error, cast err to awserr.Error to get the Code and
|
||||
// Message from an error.
|
||||
glog.Errorf(err.Error())
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
for _, p := range result.PriceList {
|
||||
prices = append(prices, p)
|
||||
}
|
||||
|
||||
if result.NextToken != nil {
|
||||
input.NextToken = result.NextToken
|
||||
} else {
|
||||
break
|
||||
}
|
||||
}
|
||||
|
||||
for _, item := range prices {
|
||||
for k, v := range item {
|
||||
if k == "product" {
|
||||
product := v.(map[string]interface{})
|
||||
attributes := map[string]string{}
|
||||
for k, v := range product["attributes"].(map[string]interface{}) {
|
||||
attributes[k] = v.(string)
|
||||
}
|
||||
|
||||
machine := awsup.AWSMachineTypeInfo{
|
||||
Name: attributes["instanceType"],
|
||||
Cores: stringToInt(attributes["vcpu"]),
|
||||
}
|
||||
|
||||
memory := strings.TrimRight(attributes["memory"], " GiB")
|
||||
machine.MemoryGB = stringToFloat32(memory)
|
||||
|
||||
if attributes["storage"] != "EBS only" {
|
||||
storage := strings.Split(attributes["storage"], " ")
|
||||
count := stringToInt(storage[0])
|
||||
size := stringToInt(storage[2])
|
||||
|
||||
ephemeralDisks := []int{}
|
||||
for i := 0; i < count; i++ {
|
||||
ephemeralDisks = append(ephemeralDisks, size)
|
||||
}
|
||||
|
||||
machine.EphemeralDisks = ephemeralDisks
|
||||
}
|
||||
|
||||
if attributes["instanceFamily"] == "GPU instance" {
|
||||
machine.GPU = true
|
||||
}
|
||||
|
||||
if attributes["ecu"] == "Variable" {
|
||||
machine.Burstable = true
|
||||
machine.ECU = t2CreditsPerHour[machine.Name] // This is actually credits * ECUs, but we'll add that later
|
||||
} else {
|
||||
machine.ECU = stringToFloat32(attributes["ecu"])
|
||||
}
|
||||
|
||||
machines = append(machines, machine)
|
||||
|
||||
family := strings.Split(attributes["instanceType"], ".")[0]
|
||||
families[family] = struct{}{}
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
sortedFamilies := []string{}
|
||||
for f := range families {
|
||||
sortedFamilies = append(sortedFamilies, f)
|
||||
}
|
||||
sort.Strings(sortedFamilies)
|
||||
|
||||
sort.Slice(machines, func(i, j int) bool { return machines[i].Name < machines[j].Name })
|
||||
|
||||
var output string
|
||||
|
||||
for _, f := range sortedFamilies {
|
||||
output = output + fmt.Sprintf("\n// %s family", f)
|
||||
for _, m := range machines {
|
||||
if family := strings.Split(m.Name, ".")[0]; family == f {
|
||||
var ecu string
|
||||
if m.Burstable {
|
||||
ecu = fmt.Sprintf("%v * BurstableCreditsToECUS", m.ECU)
|
||||
} else {
|
||||
ecu = fmt.Sprint(m.ECU)
|
||||
}
|
||||
body := fmt.Sprintf(`
|
||||
{
|
||||
Name: "%s",
|
||||
MemoryGB: %v,
|
||||
ECU: %v,
|
||||
Cores: %v,
|
||||
EphemeralDisks: %#v,
|
||||
},`, m.Name, m.MemoryGB, ecu, m.Cores, m.EphemeralDisks)
|
||||
output = output + body
|
||||
}
|
||||
}
|
||||
output = output + "\n"
|
||||
}
|
||||
|
||||
ex, err := os.Executable()
|
||||
if err != nil {
|
||||
glog.Error(err)
|
||||
}
|
||||
exPath := filepath.Dir(ex)
|
||||
path := exPath + "/../../upup/pkg/fi/cloudup/awsup/machine_types.go"
|
||||
|
||||
glog.Infof("Writing changes to %v", path)
|
||||
|
||||
fileInput, err := ioutil.ReadFile(path)
|
||||
if err != nil {
|
||||
log.Fatalln(err)
|
||||
}
|
||||
scanner := bufio.NewScanner(bytes.NewReader(fileInput))
|
||||
|
||||
scanner.Split(bufio.ScanLines)
|
||||
|
||||
var newfile string
|
||||
flag := false
|
||||
for scanner.Scan() {
|
||||
line := scanner.Text()
|
||||
|
||||
if strings.Contains(line, "END GENERATED CONTENT") {
|
||||
flag = false
|
||||
}
|
||||
if !flag {
|
||||
newfile = newfile + line + "\n"
|
||||
}
|
||||
if strings.Contains(line, "BEGIN GENERATED CONTENT") {
|
||||
flag = true
|
||||
newfile = newfile + output
|
||||
}
|
||||
}
|
||||
|
||||
err = ioutil.WriteFile(path, []byte(newfile), 0644)
|
||||
if err != nil {
|
||||
glog.Error(err)
|
||||
}
|
||||
|
||||
glog.Info("Done.")
|
||||
glog.Flush()
|
||||
}
|
||||
|
||||
func stringToFloat32(s string) float32 {
|
||||
// For 1,000 case
|
||||
clean := strings.Replace(s, ",", "", -1)
|
||||
value, err := strconv.ParseFloat(clean, 32)
|
||||
if err != nil {
|
||||
glog.Errorf("error converting string to float32: %v", err)
|
||||
}
|
||||
return float32(value)
|
||||
}
|
||||
|
||||
func stringToInt(s string) int {
|
||||
// For 1,000 case
|
||||
clean := strings.Replace(s, ",", "", -1)
|
||||
value, err := strconv.Atoi(clean)
|
||||
if err != nil {
|
||||
glog.Error(err)
|
||||
}
|
||||
return value
|
||||
}
|
File diff suppressed because it is too large
Load Diff
|
@ -0,0 +1,23 @@
|
|||
load("@io_bazel_rules_go//go:def.bzl", "go_library")
|
||||
|
||||
go_library(
|
||||
name = "go_default_library",
|
||||
srcs = [
|
||||
"api.go",
|
||||
"doc.go",
|
||||
"errors.go",
|
||||
"service.go",
|
||||
],
|
||||
importmap = "vendor/github.com/aws/aws-sdk-go/service/pricing",
|
||||
importpath = "github.com/aws/aws-sdk-go/service/pricing",
|
||||
visibility = ["//visibility:public"],
|
||||
deps = [
|
||||
"//vendor/github.com/aws/aws-sdk-go/aws:go_default_library",
|
||||
"//vendor/github.com/aws/aws-sdk-go/aws/awsutil:go_default_library",
|
||||
"//vendor/github.com/aws/aws-sdk-go/aws/client:go_default_library",
|
||||
"//vendor/github.com/aws/aws-sdk-go/aws/client/metadata:go_default_library",
|
||||
"//vendor/github.com/aws/aws-sdk-go/aws/request:go_default_library",
|
||||
"//vendor/github.com/aws/aws-sdk-go/aws/signer/v4:go_default_library",
|
||||
"//vendor/github.com/aws/aws-sdk-go/private/protocol/jsonrpc:go_default_library",
|
||||
],
|
||||
)
|
|
@ -0,0 +1,955 @@
|
|||
// Code generated by private/model/cli/gen-api/main.go. DO NOT EDIT.
|
||||
|
||||
package pricing
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
|
||||
"github.com/aws/aws-sdk-go/aws"
|
||||
"github.com/aws/aws-sdk-go/aws/awsutil"
|
||||
"github.com/aws/aws-sdk-go/aws/request"
|
||||
)
|
||||
|
||||
const opDescribeServices = "DescribeServices"
|
||||
|
||||
// DescribeServicesRequest generates a "aws/request.Request" representing the
|
||||
// client's request for the DescribeServices operation. The "output" return
|
||||
// value will be populated with the request's response once the request completes
|
||||
// successfuly.
|
||||
//
|
||||
// Use "Send" method on the returned Request to send the API call to the service.
|
||||
// the "output" return value is not valid until after Send returns without error.
|
||||
//
|
||||
// See DescribeServices for more information on using the DescribeServices
|
||||
// API call, and error handling.
|
||||
//
|
||||
// This method is useful when you want to inject custom logic or configuration
|
||||
// into the SDK's request lifecycle. Such as custom headers, or retry logic.
|
||||
//
|
||||
//
|
||||
// // Example sending a request using the DescribeServicesRequest method.
|
||||
// req, resp := client.DescribeServicesRequest(params)
|
||||
//
|
||||
// err := req.Send()
|
||||
// if err == nil { // resp is now filled
|
||||
// fmt.Println(resp)
|
||||
// }
|
||||
//
|
||||
// See also, https://docs.aws.amazon.com/goto/WebAPI/pricing-2017-10-15/DescribeServices
|
||||
func (c *Pricing) DescribeServicesRequest(input *DescribeServicesInput) (req *request.Request, output *DescribeServicesOutput) {
|
||||
op := &request.Operation{
|
||||
Name: opDescribeServices,
|
||||
HTTPMethod: "POST",
|
||||
HTTPPath: "/",
|
||||
Paginator: &request.Paginator{
|
||||
InputTokens: []string{"NextToken"},
|
||||
OutputTokens: []string{"NextToken"},
|
||||
LimitToken: "MaxResults",
|
||||
TruncationToken: "",
|
||||
},
|
||||
}
|
||||
|
||||
if input == nil {
|
||||
input = &DescribeServicesInput{}
|
||||
}
|
||||
|
||||
output = &DescribeServicesOutput{}
|
||||
req = c.newRequest(op, input, output)
|
||||
return
|
||||
}
|
||||
|
||||
// DescribeServices API operation for AWS Price List Service.
|
||||
//
|
||||
// Returns the metadata for one service or a list of the metadata for all services.
|
||||
// Use this without a service code to get the service codes for all services.
|
||||
// Use it with a service code, such as AmazonEC2, to get information specific
|
||||
// to that service, such as the attribute names available for that service.
|
||||
// For example, some of the attribute names available for EC2 are volumeType,
|
||||
// maxIopsVolume, operation, locationType, and instanceCapacity10xlarge.
|
||||
//
|
||||
// Returns awserr.Error for service API and SDK errors. Use runtime type assertions
|
||||
// with awserr.Error's Code and Message methods to get detailed information about
|
||||
// the error.
|
||||
//
|
||||
// See the AWS API reference guide for AWS Price List Service's
|
||||
// API operation DescribeServices for usage and error information.
|
||||
//
|
||||
// Returned Error Codes:
|
||||
// * ErrCodeInternalErrorException "InternalErrorException"
|
||||
// An error on the server occurred during the processing of your request. Try
|
||||
// again later.
|
||||
//
|
||||
// * ErrCodeInvalidParameterException "InvalidParameterException"
|
||||
// One or more parameters had an invalid value.
|
||||
//
|
||||
// * ErrCodeNotFoundException "NotFoundException"
|
||||
// The requested resource can't be found.
|
||||
//
|
||||
// * ErrCodeInvalidNextTokenException "InvalidNextTokenException"
|
||||
// The pagination token is invalid. Try again without a pagination token.
|
||||
//
|
||||
// * ErrCodeExpiredNextTokenException "ExpiredNextTokenException"
|
||||
// The pagination token expired. Try again without a pagination token.
|
||||
//
|
||||
// See also, https://docs.aws.amazon.com/goto/WebAPI/pricing-2017-10-15/DescribeServices
|
||||
func (c *Pricing) DescribeServices(input *DescribeServicesInput) (*DescribeServicesOutput, error) {
|
||||
req, out := c.DescribeServicesRequest(input)
|
||||
return out, req.Send()
|
||||
}
|
||||
|
||||
// DescribeServicesWithContext is the same as DescribeServices with the addition of
|
||||
// the ability to pass a context and additional request options.
|
||||
//
|
||||
// See DescribeServices for details on how to use this API operation.
|
||||
//
|
||||
// The context must be non-nil and will be used for request cancellation. If
|
||||
// the context is nil a panic will occur. In the future the SDK may create
|
||||
// sub-contexts for http.Requests. See https://golang.org/pkg/context/
|
||||
// for more information on using Contexts.
|
||||
func (c *Pricing) DescribeServicesWithContext(ctx aws.Context, input *DescribeServicesInput, opts ...request.Option) (*DescribeServicesOutput, error) {
|
||||
req, out := c.DescribeServicesRequest(input)
|
||||
req.SetContext(ctx)
|
||||
req.ApplyOptions(opts...)
|
||||
return out, req.Send()
|
||||
}
|
||||
|
||||
// DescribeServicesPages iterates over the pages of a DescribeServices operation,
|
||||
// calling the "fn" function with the response data for each page. To stop
|
||||
// iterating, return false from the fn function.
|
||||
//
|
||||
// See DescribeServices method for more information on how to use this operation.
|
||||
//
|
||||
// Note: This operation can generate multiple requests to a service.
|
||||
//
|
||||
// // Example iterating over at most 3 pages of a DescribeServices operation.
|
||||
// pageNum := 0
|
||||
// err := client.DescribeServicesPages(params,
|
||||
// func(page *DescribeServicesOutput, lastPage bool) bool {
|
||||
// pageNum++
|
||||
// fmt.Println(page)
|
||||
// return pageNum <= 3
|
||||
// })
|
||||
//
|
||||
func (c *Pricing) DescribeServicesPages(input *DescribeServicesInput, fn func(*DescribeServicesOutput, bool) bool) error {
|
||||
return c.DescribeServicesPagesWithContext(aws.BackgroundContext(), input, fn)
|
||||
}
|
||||
|
||||
// DescribeServicesPagesWithContext same as DescribeServicesPages except
|
||||
// it takes a Context and allows setting request options on the pages.
|
||||
//
|
||||
// The context must be non-nil and will be used for request cancellation. If
|
||||
// the context is nil a panic will occur. In the future the SDK may create
|
||||
// sub-contexts for http.Requests. See https://golang.org/pkg/context/
|
||||
// for more information on using Contexts.
|
||||
func (c *Pricing) DescribeServicesPagesWithContext(ctx aws.Context, input *DescribeServicesInput, fn func(*DescribeServicesOutput, bool) bool, opts ...request.Option) error {
|
||||
p := request.Pagination{
|
||||
NewRequest: func() (*request.Request, error) {
|
||||
var inCpy *DescribeServicesInput
|
||||
if input != nil {
|
||||
tmp := *input
|
||||
inCpy = &tmp
|
||||
}
|
||||
req, _ := c.DescribeServicesRequest(inCpy)
|
||||
req.SetContext(ctx)
|
||||
req.ApplyOptions(opts...)
|
||||
return req, nil
|
||||
},
|
||||
}
|
||||
|
||||
cont := true
|
||||
for p.Next() && cont {
|
||||
cont = fn(p.Page().(*DescribeServicesOutput), !p.HasNextPage())
|
||||
}
|
||||
return p.Err()
|
||||
}
|
||||
|
||||
const opGetAttributeValues = "GetAttributeValues"
|
||||
|
||||
// GetAttributeValuesRequest generates a "aws/request.Request" representing the
|
||||
// client's request for the GetAttributeValues operation. The "output" return
|
||||
// value will be populated with the request's response once the request completes
|
||||
// successfuly.
|
||||
//
|
||||
// Use "Send" method on the returned Request to send the API call to the service.
|
||||
// the "output" return value is not valid until after Send returns without error.
|
||||
//
|
||||
// See GetAttributeValues for more information on using the GetAttributeValues
|
||||
// API call, and error handling.
|
||||
//
|
||||
// This method is useful when you want to inject custom logic or configuration
|
||||
// into the SDK's request lifecycle. Such as custom headers, or retry logic.
|
||||
//
|
||||
//
|
||||
// // Example sending a request using the GetAttributeValuesRequest method.
|
||||
// req, resp := client.GetAttributeValuesRequest(params)
|
||||
//
|
||||
// err := req.Send()
|
||||
// if err == nil { // resp is now filled
|
||||
// fmt.Println(resp)
|
||||
// }
|
||||
//
|
||||
// See also, https://docs.aws.amazon.com/goto/WebAPI/pricing-2017-10-15/GetAttributeValues
|
||||
func (c *Pricing) GetAttributeValuesRequest(input *GetAttributeValuesInput) (req *request.Request, output *GetAttributeValuesOutput) {
|
||||
op := &request.Operation{
|
||||
Name: opGetAttributeValues,
|
||||
HTTPMethod: "POST",
|
||||
HTTPPath: "/",
|
||||
Paginator: &request.Paginator{
|
||||
InputTokens: []string{"NextToken"},
|
||||
OutputTokens: []string{"NextToken"},
|
||||
LimitToken: "MaxResults",
|
||||
TruncationToken: "",
|
||||
},
|
||||
}
|
||||
|
||||
if input == nil {
|
||||
input = &GetAttributeValuesInput{}
|
||||
}
|
||||
|
||||
output = &GetAttributeValuesOutput{}
|
||||
req = c.newRequest(op, input, output)
|
||||
return
|
||||
}
|
||||
|
||||
// GetAttributeValues API operation for AWS Price List Service.
|
||||
//
|
||||
// Returns a list of attribute values. Attibutes are similar to the details
|
||||
// in a Price List API offer file. For a list of available attributes, see Offer
|
||||
// File Definitions (http://docs.aws.amazon.com/awsaccountbilling/latest/aboutv2/reading-an-offer.html#pps-defs)
|
||||
// in the AWS Billing and Cost Management User Guide (http://docs.aws.amazon.com/awsaccountbilling/latest/aboutv2/billing-what-is.html).
|
||||
//
|
||||
// Returns awserr.Error for service API and SDK errors. Use runtime type assertions
|
||||
// with awserr.Error's Code and Message methods to get detailed information about
|
||||
// the error.
|
||||
//
|
||||
// See the AWS API reference guide for AWS Price List Service's
|
||||
// API operation GetAttributeValues for usage and error information.
|
||||
//
|
||||
// Returned Error Codes:
|
||||
// * ErrCodeInternalErrorException "InternalErrorException"
|
||||
// An error on the server occurred during the processing of your request. Try
|
||||
// again later.
|
||||
//
|
||||
// * ErrCodeInvalidParameterException "InvalidParameterException"
|
||||
// One or more parameters had an invalid value.
|
||||
//
|
||||
// * ErrCodeNotFoundException "NotFoundException"
|
||||
// The requested resource can't be found.
|
||||
//
|
||||
// * ErrCodeInvalidNextTokenException "InvalidNextTokenException"
|
||||
// The pagination token is invalid. Try again without a pagination token.
|
||||
//
|
||||
// * ErrCodeExpiredNextTokenException "ExpiredNextTokenException"
|
||||
// The pagination token expired. Try again without a pagination token.
|
||||
//
|
||||
// See also, https://docs.aws.amazon.com/goto/WebAPI/pricing-2017-10-15/GetAttributeValues
|
||||
func (c *Pricing) GetAttributeValues(input *GetAttributeValuesInput) (*GetAttributeValuesOutput, error) {
|
||||
req, out := c.GetAttributeValuesRequest(input)
|
||||
return out, req.Send()
|
||||
}
|
||||
|
||||
// GetAttributeValuesWithContext is the same as GetAttributeValues with the addition of
|
||||
// the ability to pass a context and additional request options.
|
||||
//
|
||||
// See GetAttributeValues for details on how to use this API operation.
|
||||
//
|
||||
// The context must be non-nil and will be used for request cancellation. If
|
||||
// the context is nil a panic will occur. In the future the SDK may create
|
||||
// sub-contexts for http.Requests. See https://golang.org/pkg/context/
|
||||
// for more information on using Contexts.
|
||||
func (c *Pricing) GetAttributeValuesWithContext(ctx aws.Context, input *GetAttributeValuesInput, opts ...request.Option) (*GetAttributeValuesOutput, error) {
|
||||
req, out := c.GetAttributeValuesRequest(input)
|
||||
req.SetContext(ctx)
|
||||
req.ApplyOptions(opts...)
|
||||
return out, req.Send()
|
||||
}
|
||||
|
||||
// GetAttributeValuesPages iterates over the pages of a GetAttributeValues operation,
|
||||
// calling the "fn" function with the response data for each page. To stop
|
||||
// iterating, return false from the fn function.
|
||||
//
|
||||
// See GetAttributeValues method for more information on how to use this operation.
|
||||
//
|
||||
// Note: This operation can generate multiple requests to a service.
|
||||
//
|
||||
// // Example iterating over at most 3 pages of a GetAttributeValues operation.
|
||||
// pageNum := 0
|
||||
// err := client.GetAttributeValuesPages(params,
|
||||
// func(page *GetAttributeValuesOutput, lastPage bool) bool {
|
||||
// pageNum++
|
||||
// fmt.Println(page)
|
||||
// return pageNum <= 3
|
||||
// })
|
||||
//
|
||||
func (c *Pricing) GetAttributeValuesPages(input *GetAttributeValuesInput, fn func(*GetAttributeValuesOutput, bool) bool) error {
|
||||
return c.GetAttributeValuesPagesWithContext(aws.BackgroundContext(), input, fn)
|
||||
}
|
||||
|
||||
// GetAttributeValuesPagesWithContext same as GetAttributeValuesPages except
|
||||
// it takes a Context and allows setting request options on the pages.
|
||||
//
|
||||
// The context must be non-nil and will be used for request cancellation. If
|
||||
// the context is nil a panic will occur. In the future the SDK may create
|
||||
// sub-contexts for http.Requests. See https://golang.org/pkg/context/
|
||||
// for more information on using Contexts.
|
||||
func (c *Pricing) GetAttributeValuesPagesWithContext(ctx aws.Context, input *GetAttributeValuesInput, fn func(*GetAttributeValuesOutput, bool) bool, opts ...request.Option) error {
|
||||
p := request.Pagination{
|
||||
NewRequest: func() (*request.Request, error) {
|
||||
var inCpy *GetAttributeValuesInput
|
||||
if input != nil {
|
||||
tmp := *input
|
||||
inCpy = &tmp
|
||||
}
|
||||
req, _ := c.GetAttributeValuesRequest(inCpy)
|
||||
req.SetContext(ctx)
|
||||
req.ApplyOptions(opts...)
|
||||
return req, nil
|
||||
},
|
||||
}
|
||||
|
||||
cont := true
|
||||
for p.Next() && cont {
|
||||
cont = fn(p.Page().(*GetAttributeValuesOutput), !p.HasNextPage())
|
||||
}
|
||||
return p.Err()
|
||||
}
|
||||
|
||||
const opGetProducts = "GetProducts"
|
||||
|
||||
// GetProductsRequest generates a "aws/request.Request" representing the
|
||||
// client's request for the GetProducts operation. The "output" return
|
||||
// value will be populated with the request's response once the request completes
|
||||
// successfuly.
|
||||
//
|
||||
// Use "Send" method on the returned Request to send the API call to the service.
|
||||
// the "output" return value is not valid until after Send returns without error.
|
||||
//
|
||||
// See GetProducts for more information on using the GetProducts
|
||||
// API call, and error handling.
|
||||
//
|
||||
// This method is useful when you want to inject custom logic or configuration
|
||||
// into the SDK's request lifecycle. Such as custom headers, or retry logic.
|
||||
//
|
||||
//
|
||||
// // Example sending a request using the GetProductsRequest method.
|
||||
// req, resp := client.GetProductsRequest(params)
|
||||
//
|
||||
// err := req.Send()
|
||||
// if err == nil { // resp is now filled
|
||||
// fmt.Println(resp)
|
||||
// }
|
||||
//
|
||||
// See also, https://docs.aws.amazon.com/goto/WebAPI/pricing-2017-10-15/GetProducts
|
||||
func (c *Pricing) GetProductsRequest(input *GetProductsInput) (req *request.Request, output *GetProductsOutput) {
|
||||
op := &request.Operation{
|
||||
Name: opGetProducts,
|
||||
HTTPMethod: "POST",
|
||||
HTTPPath: "/",
|
||||
Paginator: &request.Paginator{
|
||||
InputTokens: []string{"NextToken"},
|
||||
OutputTokens: []string{"NextToken"},
|
||||
LimitToken: "MaxResults",
|
||||
TruncationToken: "",
|
||||
},
|
||||
}
|
||||
|
||||
if input == nil {
|
||||
input = &GetProductsInput{}
|
||||
}
|
||||
|
||||
output = &GetProductsOutput{}
|
||||
req = c.newRequest(op, input, output)
|
||||
return
|
||||
}
|
||||
|
||||
// GetProducts API operation for AWS Price List Service.
|
||||
//
|
||||
// Returns a list of all products that match the filter criteria.
|
||||
//
|
||||
// Returns awserr.Error for service API and SDK errors. Use runtime type assertions
|
||||
// with awserr.Error's Code and Message methods to get detailed information about
|
||||
// the error.
|
||||
//
|
||||
// See the AWS API reference guide for AWS Price List Service's
|
||||
// API operation GetProducts for usage and error information.
|
||||
//
|
||||
// Returned Error Codes:
|
||||
// * ErrCodeInternalErrorException "InternalErrorException"
|
||||
// An error on the server occurred during the processing of your request. Try
|
||||
// again later.
|
||||
//
|
||||
// * ErrCodeInvalidParameterException "InvalidParameterException"
|
||||
// One or more parameters had an invalid value.
|
||||
//
|
||||
// * ErrCodeNotFoundException "NotFoundException"
|
||||
// The requested resource can't be found.
|
||||
//
|
||||
// * ErrCodeInvalidNextTokenException "InvalidNextTokenException"
|
||||
// The pagination token is invalid. Try again without a pagination token.
|
||||
//
|
||||
// * ErrCodeExpiredNextTokenException "ExpiredNextTokenException"
|
||||
// The pagination token expired. Try again without a pagination token.
|
||||
//
|
||||
// See also, https://docs.aws.amazon.com/goto/WebAPI/pricing-2017-10-15/GetProducts
|
||||
func (c *Pricing) GetProducts(input *GetProductsInput) (*GetProductsOutput, error) {
|
||||
req, out := c.GetProductsRequest(input)
|
||||
return out, req.Send()
|
||||
}
|
||||
|
||||
// GetProductsWithContext is the same as GetProducts with the addition of
|
||||
// the ability to pass a context and additional request options.
|
||||
//
|
||||
// See GetProducts for details on how to use this API operation.
|
||||
//
|
||||
// The context must be non-nil and will be used for request cancellation. If
|
||||
// the context is nil a panic will occur. In the future the SDK may create
|
||||
// sub-contexts for http.Requests. See https://golang.org/pkg/context/
|
||||
// for more information on using Contexts.
|
||||
func (c *Pricing) GetProductsWithContext(ctx aws.Context, input *GetProductsInput, opts ...request.Option) (*GetProductsOutput, error) {
|
||||
req, out := c.GetProductsRequest(input)
|
||||
req.SetContext(ctx)
|
||||
req.ApplyOptions(opts...)
|
||||
return out, req.Send()
|
||||
}
|
||||
|
||||
// GetProductsPages iterates over the pages of a GetProducts operation,
|
||||
// calling the "fn" function with the response data for each page. To stop
|
||||
// iterating, return false from the fn function.
|
||||
//
|
||||
// See GetProducts method for more information on how to use this operation.
|
||||
//
|
||||
// Note: This operation can generate multiple requests to a service.
|
||||
//
|
||||
// // Example iterating over at most 3 pages of a GetProducts operation.
|
||||
// pageNum := 0
|
||||
// err := client.GetProductsPages(params,
|
||||
// func(page *GetProductsOutput, lastPage bool) bool {
|
||||
// pageNum++
|
||||
// fmt.Println(page)
|
||||
// return pageNum <= 3
|
||||
// })
|
||||
//
|
||||
func (c *Pricing) GetProductsPages(input *GetProductsInput, fn func(*GetProductsOutput, bool) bool) error {
|
||||
return c.GetProductsPagesWithContext(aws.BackgroundContext(), input, fn)
|
||||
}
|
||||
|
||||
// GetProductsPagesWithContext same as GetProductsPages except
|
||||
// it takes a Context and allows setting request options on the pages.
|
||||
//
|
||||
// The context must be non-nil and will be used for request cancellation. If
|
||||
// the context is nil a panic will occur. In the future the SDK may create
|
||||
// sub-contexts for http.Requests. See https://golang.org/pkg/context/
|
||||
// for more information on using Contexts.
|
||||
func (c *Pricing) GetProductsPagesWithContext(ctx aws.Context, input *GetProductsInput, fn func(*GetProductsOutput, bool) bool, opts ...request.Option) error {
|
||||
p := request.Pagination{
|
||||
NewRequest: func() (*request.Request, error) {
|
||||
var inCpy *GetProductsInput
|
||||
if input != nil {
|
||||
tmp := *input
|
||||
inCpy = &tmp
|
||||
}
|
||||
req, _ := c.GetProductsRequest(inCpy)
|
||||
req.SetContext(ctx)
|
||||
req.ApplyOptions(opts...)
|
||||
return req, nil
|
||||
},
|
||||
}
|
||||
|
||||
cont := true
|
||||
for p.Next() && cont {
|
||||
cont = fn(p.Page().(*GetProductsOutput), !p.HasNextPage())
|
||||
}
|
||||
return p.Err()
|
||||
}
|
||||
|
||||
// The values of a given attribute, such as Throughput Optimized HDD or Provisioned
|
||||
// IOPS for the Amazon EC2volumeType attribute.
|
||||
type AttributeValue struct {
|
||||
_ struct{} `type:"structure"`
|
||||
|
||||
// The specific value of an attributeName.
|
||||
Value *string `type:"string"`
|
||||
}
|
||||
|
||||
// String returns the string representation
|
||||
func (s AttributeValue) String() string {
|
||||
return awsutil.Prettify(s)
|
||||
}
|
||||
|
||||
// GoString returns the string representation
|
||||
func (s AttributeValue) GoString() string {
|
||||
return s.String()
|
||||
}
|
||||
|
||||
// SetValue sets the Value field's value.
|
||||
func (s *AttributeValue) SetValue(v string) *AttributeValue {
|
||||
s.Value = &v
|
||||
return s
|
||||
}
|
||||
|
||||
type DescribeServicesInput struct {
|
||||
_ struct{} `type:"structure"`
|
||||
|
||||
// The format version that you want the response to be in.
|
||||
//
|
||||
// Valid values are: aws_v1
|
||||
FormatVersion *string `type:"string"`
|
||||
|
||||
// The maximum number of results that you want returned in the response.
|
||||
MaxResults *int64 `min:"1" type:"integer"`
|
||||
|
||||
// The pagination token that indicates the next set of results that you want
|
||||
// to retrieve.
|
||||
NextToken *string `type:"string"`
|
||||
|
||||
// The code for the service whose information you want to retrieve, such as
|
||||
// AmazonEC2. You can use the ServiceCode to filter the results in a GetProducts
|
||||
// call. To retrieve a list of all services, leave this blank.
|
||||
ServiceCode *string `type:"string"`
|
||||
}
|
||||
|
||||
// String returns the string representation
|
||||
func (s DescribeServicesInput) String() string {
|
||||
return awsutil.Prettify(s)
|
||||
}
|
||||
|
||||
// GoString returns the string representation
|
||||
func (s DescribeServicesInput) GoString() string {
|
||||
return s.String()
|
||||
}
|
||||
|
||||
// Validate inspects the fields of the type to determine if they are valid.
|
||||
func (s *DescribeServicesInput) Validate() error {
|
||||
invalidParams := request.ErrInvalidParams{Context: "DescribeServicesInput"}
|
||||
if s.MaxResults != nil && *s.MaxResults < 1 {
|
||||
invalidParams.Add(request.NewErrParamMinValue("MaxResults", 1))
|
||||
}
|
||||
|
||||
if invalidParams.Len() > 0 {
|
||||
return invalidParams
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
// SetFormatVersion sets the FormatVersion field's value.
|
||||
func (s *DescribeServicesInput) SetFormatVersion(v string) *DescribeServicesInput {
|
||||
s.FormatVersion = &v
|
||||
return s
|
||||
}
|
||||
|
||||
// SetMaxResults sets the MaxResults field's value.
|
||||
func (s *DescribeServicesInput) SetMaxResults(v int64) *DescribeServicesInput {
|
||||
s.MaxResults = &v
|
||||
return s
|
||||
}
|
||||
|
||||
// SetNextToken sets the NextToken field's value.
|
||||
func (s *DescribeServicesInput) SetNextToken(v string) *DescribeServicesInput {
|
||||
s.NextToken = &v
|
||||
return s
|
||||
}
|
||||
|
||||
// SetServiceCode sets the ServiceCode field's value.
|
||||
func (s *DescribeServicesInput) SetServiceCode(v string) *DescribeServicesInput {
|
||||
s.ServiceCode = &v
|
||||
return s
|
||||
}
|
||||
|
||||
type DescribeServicesOutput struct {
|
||||
_ struct{} `type:"structure"`
|
||||
|
||||
// The format version of the response. For example, aws_v1.
|
||||
FormatVersion *string `type:"string"`
|
||||
|
||||
// The pagination token for the next set of retreivable results.
|
||||
NextToken *string `type:"string"`
|
||||
|
||||
// The service metadata for the service or services in the response.
|
||||
Services []*Service `type:"list"`
|
||||
}
|
||||
|
||||
// String returns the string representation
|
||||
func (s DescribeServicesOutput) String() string {
|
||||
return awsutil.Prettify(s)
|
||||
}
|
||||
|
||||
// GoString returns the string representation
|
||||
func (s DescribeServicesOutput) GoString() string {
|
||||
return s.String()
|
||||
}
|
||||
|
||||
// SetFormatVersion sets the FormatVersion field's value.
|
||||
func (s *DescribeServicesOutput) SetFormatVersion(v string) *DescribeServicesOutput {
|
||||
s.FormatVersion = &v
|
||||
return s
|
||||
}
|
||||
|
||||
// SetNextToken sets the NextToken field's value.
|
||||
func (s *DescribeServicesOutput) SetNextToken(v string) *DescribeServicesOutput {
|
||||
s.NextToken = &v
|
||||
return s
|
||||
}
|
||||
|
||||
// SetServices sets the Services field's value.
|
||||
func (s *DescribeServicesOutput) SetServices(v []*Service) *DescribeServicesOutput {
|
||||
s.Services = v
|
||||
return s
|
||||
}
|
||||
|
||||
// The constraints that you want all returned products to match.
|
||||
type Filter struct {
|
||||
_ struct{} `type:"structure"`
|
||||
|
||||
// The product metadata field that you want to filter on. You can filter by
|
||||
// just the service code to see all products for a specific service, filter
|
||||
// by just the attribute name to see a specific attribute for multiple services,
|
||||
// or use both a service code and an attribute name to retrieve only products
|
||||
// that match both fields.
|
||||
//
|
||||
// Valid values include: ServiceCode, and all attribute names
|
||||
//
|
||||
// For example, you can filter by the AmazonEC2 service code and the volumeType
|
||||
// attribute name to get the prices for only Amazon EC2 volumes.
|
||||
//
|
||||
// Field is a required field
|
||||
Field *string `type:"string" required:"true"`
|
||||
|
||||
// The type of filter that you want to use.
|
||||
//
|
||||
// Valid values are: TERM_MATCH. TERM_MATCH returns only products that match
|
||||
// both the given filter field and the given value.
|
||||
//
|
||||
// Type is a required field
|
||||
Type *string `type:"string" required:"true" enum:"FilterType"`
|
||||
|
||||
// The service code or attribute value that you want to filter by. If you are
|
||||
// filtering by service code this is the actual service code, such as AmazonEC2.
|
||||
// If you are filtering by attribute name, this is the attribute value that
|
||||
// you want the returned products to match, such as a Provisioned IOPS volume.
|
||||
//
|
||||
// Value is a required field
|
||||
Value *string `type:"string" required:"true"`
|
||||
}
|
||||
|
||||
// String returns the string representation
|
||||
func (s Filter) String() string {
|
||||
return awsutil.Prettify(s)
|
||||
}
|
||||
|
||||
// GoString returns the string representation
|
||||
func (s Filter) GoString() string {
|
||||
return s.String()
|
||||
}
|
||||
|
||||
// Validate inspects the fields of the type to determine if they are valid.
|
||||
func (s *Filter) Validate() error {
|
||||
invalidParams := request.ErrInvalidParams{Context: "Filter"}
|
||||
if s.Field == nil {
|
||||
invalidParams.Add(request.NewErrParamRequired("Field"))
|
||||
}
|
||||
if s.Type == nil {
|
||||
invalidParams.Add(request.NewErrParamRequired("Type"))
|
||||
}
|
||||
if s.Value == nil {
|
||||
invalidParams.Add(request.NewErrParamRequired("Value"))
|
||||
}
|
||||
|
||||
if invalidParams.Len() > 0 {
|
||||
return invalidParams
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
// SetField sets the Field field's value.
|
||||
func (s *Filter) SetField(v string) *Filter {
|
||||
s.Field = &v
|
||||
return s
|
||||
}
|
||||
|
||||
// SetType sets the Type field's value.
|
||||
func (s *Filter) SetType(v string) *Filter {
|
||||
s.Type = &v
|
||||
return s
|
||||
}
|
||||
|
||||
// SetValue sets the Value field's value.
|
||||
func (s *Filter) SetValue(v string) *Filter {
|
||||
s.Value = &v
|
||||
return s
|
||||
}
|
||||
|
||||
type GetAttributeValuesInput struct {
|
||||
_ struct{} `type:"structure"`
|
||||
|
||||
// The name of the attribute that you want to retrieve the values for, such
|
||||
// as volumeType.
|
||||
//
|
||||
// AttributeName is a required field
|
||||
AttributeName *string `type:"string" required:"true"`
|
||||
|
||||
// The maximum number of results to return in response.
|
||||
MaxResults *int64 `min:"1" type:"integer"`
|
||||
|
||||
// The pagination token that indicates the next set of results that you want
|
||||
// to retrieve.
|
||||
NextToken *string `type:"string"`
|
||||
|
||||
// The service code for the service whose attributes you want to retrieve. For
|
||||
// example, if you want the retrieve an EC2 attribute, use AmazonEC2.
|
||||
//
|
||||
// ServiceCode is a required field
|
||||
ServiceCode *string `type:"string" required:"true"`
|
||||
}
|
||||
|
||||
// String returns the string representation
|
||||
func (s GetAttributeValuesInput) String() string {
|
||||
return awsutil.Prettify(s)
|
||||
}
|
||||
|
||||
// GoString returns the string representation
|
||||
func (s GetAttributeValuesInput) GoString() string {
|
||||
return s.String()
|
||||
}
|
||||
|
||||
// Validate inspects the fields of the type to determine if they are valid.
|
||||
func (s *GetAttributeValuesInput) Validate() error {
|
||||
invalidParams := request.ErrInvalidParams{Context: "GetAttributeValuesInput"}
|
||||
if s.AttributeName == nil {
|
||||
invalidParams.Add(request.NewErrParamRequired("AttributeName"))
|
||||
}
|
||||
if s.MaxResults != nil && *s.MaxResults < 1 {
|
||||
invalidParams.Add(request.NewErrParamMinValue("MaxResults", 1))
|
||||
}
|
||||
if s.ServiceCode == nil {
|
||||
invalidParams.Add(request.NewErrParamRequired("ServiceCode"))
|
||||
}
|
||||
|
||||
if invalidParams.Len() > 0 {
|
||||
return invalidParams
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
// SetAttributeName sets the AttributeName field's value.
|
||||
func (s *GetAttributeValuesInput) SetAttributeName(v string) *GetAttributeValuesInput {
|
||||
s.AttributeName = &v
|
||||
return s
|
||||
}
|
||||
|
||||
// SetMaxResults sets the MaxResults field's value.
|
||||
func (s *GetAttributeValuesInput) SetMaxResults(v int64) *GetAttributeValuesInput {
|
||||
s.MaxResults = &v
|
||||
return s
|
||||
}
|
||||
|
||||
// SetNextToken sets the NextToken field's value.
|
||||
func (s *GetAttributeValuesInput) SetNextToken(v string) *GetAttributeValuesInput {
|
||||
s.NextToken = &v
|
||||
return s
|
||||
}
|
||||
|
||||
// SetServiceCode sets the ServiceCode field's value.
|
||||
func (s *GetAttributeValuesInput) SetServiceCode(v string) *GetAttributeValuesInput {
|
||||
s.ServiceCode = &v
|
||||
return s
|
||||
}
|
||||
|
||||
type GetAttributeValuesOutput struct {
|
||||
_ struct{} `type:"structure"`
|
||||
|
||||
// The list of values for an attribute. For example, Throughput Optimized HDD
|
||||
// and Provisioned IOPS are two available values for the AmazonEC2volumeType.
|
||||
AttributeValues []*AttributeValue `type:"list"`
|
||||
|
||||
// The pagination token that indicates the next set of results to retrieve.
|
||||
NextToken *string `type:"string"`
|
||||
}
|
||||
|
||||
// String returns the string representation
|
||||
func (s GetAttributeValuesOutput) String() string {
|
||||
return awsutil.Prettify(s)
|
||||
}
|
||||
|
||||
// GoString returns the string representation
|
||||
func (s GetAttributeValuesOutput) GoString() string {
|
||||
return s.String()
|
||||
}
|
||||
|
||||
// SetAttributeValues sets the AttributeValues field's value.
|
||||
func (s *GetAttributeValuesOutput) SetAttributeValues(v []*AttributeValue) *GetAttributeValuesOutput {
|
||||
s.AttributeValues = v
|
||||
return s
|
||||
}
|
||||
|
||||
// SetNextToken sets the NextToken field's value.
|
||||
func (s *GetAttributeValuesOutput) SetNextToken(v string) *GetAttributeValuesOutput {
|
||||
s.NextToken = &v
|
||||
return s
|
||||
}
|
||||
|
||||
type GetProductsInput struct {
|
||||
_ struct{} `type:"structure"`
|
||||
|
||||
// The list of filters that limit the returned products. only products that
|
||||
// match all filters are returned.
|
||||
Filters []*Filter `type:"list"`
|
||||
|
||||
// The format version that you want the response to be in.
|
||||
//
|
||||
// Valid values are: aws_v1
|
||||
FormatVersion *string `type:"string"`
|
||||
|
||||
// The maximum number of results to return in the response.
|
||||
MaxResults *int64 `min:"1" type:"integer"`
|
||||
|
||||
// The pagination token that indicates the next set of results that you want
|
||||
// to retrieve.
|
||||
NextToken *string `type:"string"`
|
||||
|
||||
// The code for the service whose products you want to retrieve.
|
||||
ServiceCode *string `type:"string"`
|
||||
}
|
||||
|
||||
// String returns the string representation
|
||||
func (s GetProductsInput) String() string {
|
||||
return awsutil.Prettify(s)
|
||||
}
|
||||
|
||||
// GoString returns the string representation
|
||||
func (s GetProductsInput) GoString() string {
|
||||
return s.String()
|
||||
}
|
||||
|
||||
// Validate inspects the fields of the type to determine if they are valid.
|
||||
func (s *GetProductsInput) Validate() error {
|
||||
invalidParams := request.ErrInvalidParams{Context: "GetProductsInput"}
|
||||
if s.MaxResults != nil && *s.MaxResults < 1 {
|
||||
invalidParams.Add(request.NewErrParamMinValue("MaxResults", 1))
|
||||
}
|
||||
if s.Filters != nil {
|
||||
for i, v := range s.Filters {
|
||||
if v == nil {
|
||||
continue
|
||||
}
|
||||
if err := v.Validate(); err != nil {
|
||||
invalidParams.AddNested(fmt.Sprintf("%s[%v]", "Filters", i), err.(request.ErrInvalidParams))
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if invalidParams.Len() > 0 {
|
||||
return invalidParams
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
// SetFilters sets the Filters field's value.
|
||||
func (s *GetProductsInput) SetFilters(v []*Filter) *GetProductsInput {
|
||||
s.Filters = v
|
||||
return s
|
||||
}
|
||||
|
||||
// SetFormatVersion sets the FormatVersion field's value.
|
||||
func (s *GetProductsInput) SetFormatVersion(v string) *GetProductsInput {
|
||||
s.FormatVersion = &v
|
||||
return s
|
||||
}
|
||||
|
||||
// SetMaxResults sets the MaxResults field's value.
|
||||
func (s *GetProductsInput) SetMaxResults(v int64) *GetProductsInput {
|
||||
s.MaxResults = &v
|
||||
return s
|
||||
}
|
||||
|
||||
// SetNextToken sets the NextToken field's value.
|
||||
func (s *GetProductsInput) SetNextToken(v string) *GetProductsInput {
|
||||
s.NextToken = &v
|
||||
return s
|
||||
}
|
||||
|
||||
// SetServiceCode sets the ServiceCode field's value.
|
||||
func (s *GetProductsInput) SetServiceCode(v string) *GetProductsInput {
|
||||
s.ServiceCode = &v
|
||||
return s
|
||||
}
|
||||
|
||||
type GetProductsOutput struct {
|
||||
_ struct{} `type:"structure"`
|
||||
|
||||
// The format version of the response. For example, aws_v1.
|
||||
FormatVersion *string `type:"string"`
|
||||
|
||||
// The pagination token that indicates the next set of results to retrieve.
|
||||
NextToken *string `type:"string"`
|
||||
|
||||
// The list of products that match your filters. The list contains both the
|
||||
// product metadata and the price information.
|
||||
PriceList []aws.JSONValue `type:"list"`
|
||||
}
|
||||
|
||||
// String returns the string representation
|
||||
func (s GetProductsOutput) String() string {
|
||||
return awsutil.Prettify(s)
|
||||
}
|
||||
|
||||
// GoString returns the string representation
|
||||
func (s GetProductsOutput) GoString() string {
|
||||
return s.String()
|
||||
}
|
||||
|
||||
// SetFormatVersion sets the FormatVersion field's value.
|
||||
func (s *GetProductsOutput) SetFormatVersion(v string) *GetProductsOutput {
|
||||
s.FormatVersion = &v
|
||||
return s
|
||||
}
|
||||
|
||||
// SetNextToken sets the NextToken field's value.
|
||||
func (s *GetProductsOutput) SetNextToken(v string) *GetProductsOutput {
|
||||
s.NextToken = &v
|
||||
return s
|
||||
}
|
||||
|
||||
// SetPriceList sets the PriceList field's value.
|
||||
func (s *GetProductsOutput) SetPriceList(v []aws.JSONValue) *GetProductsOutput {
|
||||
s.PriceList = v
|
||||
return s
|
||||
}
|
||||
|
||||
// The metadata for a service, such as the service code and available attribute
|
||||
// names.
|
||||
type Service struct {
|
||||
_ struct{} `type:"structure"`
|
||||
|
||||
// The attributes that are available for this service.
|
||||
AttributeNames []*string `type:"list"`
|
||||
|
||||
// The code for the AWS service.
|
||||
ServiceCode *string `type:"string"`
|
||||
}
|
||||
|
||||
// String returns the string representation
|
||||
func (s Service) String() string {
|
||||
return awsutil.Prettify(s)
|
||||
}
|
||||
|
||||
// GoString returns the string representation
|
||||
func (s Service) GoString() string {
|
||||
return s.String()
|
||||
}
|
||||
|
||||
// SetAttributeNames sets the AttributeNames field's value.
|
||||
func (s *Service) SetAttributeNames(v []*string) *Service {
|
||||
s.AttributeNames = v
|
||||
return s
|
||||
}
|
||||
|
||||
// SetServiceCode sets the ServiceCode field's value.
|
||||
func (s *Service) SetServiceCode(v string) *Service {
|
||||
s.ServiceCode = &v
|
||||
return s
|
||||
}
|
||||
|
||||
const (
|
||||
// FilterTypeTermMatch is a FilterType enum value
|
||||
FilterTypeTermMatch = "TERM_MATCH"
|
||||
)
|
|
@ -0,0 +1,51 @@
|
|||
// Code generated by private/model/cli/gen-api/main.go. DO NOT EDIT.
|
||||
|
||||
// Package pricing provides the client and types for making API
|
||||
// requests to AWS Price List Service.
|
||||
//
|
||||
// AWS Price List Service API (AWS Price List Service) is a centralized and
|
||||
// convenient way to programmatically query Amazon Web Services for services,
|
||||
// products, and pricing information. The AWS Price List Service uses standardized
|
||||
// product attributes such as Location, Storage Class, and Operating System,
|
||||
// and provides prices at the SKU level. You can use the AWS Price List Service
|
||||
// to build cost control and scenario planning tools, reconcile billing data,
|
||||
// forecast future spend for budgeting purposes, and provide cost benefit analysis
|
||||
// that compare your internal workloads with AWS.
|
||||
//
|
||||
// Use GetServices without a service code to retrieve the service codes for
|
||||
// all AWS services, then GetServices with a service code to retreive the attribute
|
||||
// names for that service. After you have the service code and attribute names,
|
||||
// you can use GetAttributeValues to see what values are available for an attribute.
|
||||
// With the service code and an attribute name and value, you can use GetProducts
|
||||
// to find specific products that you're interested in, such as an AmazonEC2
|
||||
// instance, with a Provisioned IOPSvolumeType.
|
||||
//
|
||||
// Service Endpoint
|
||||
//
|
||||
// AWS Price List Service API provides the following two endpoints:
|
||||
//
|
||||
// * https://api.pricing.us-east-1.amazonaws.com
|
||||
//
|
||||
// * https://api.pricing.ap-south-1.amazonaws.com
|
||||
//
|
||||
// See https://docs.aws.amazon.com/goto/WebAPI/pricing-2017-10-15 for more information on this service.
|
||||
//
|
||||
// See pricing package documentation for more information.
|
||||
// https://docs.aws.amazon.com/sdk-for-go/api/service/pricing/
|
||||
//
|
||||
// Using the Client
|
||||
//
|
||||
// To contact AWS Price List Service with the SDK use the New function to create
|
||||
// a new service client. With that client you can make API requests to the service.
|
||||
// These clients are safe to use concurrently.
|
||||
//
|
||||
// See the SDK's documentation for more information on how to use the SDK.
|
||||
// https://docs.aws.amazon.com/sdk-for-go/api/
|
||||
//
|
||||
// See aws.Config documentation for more information on configuring SDK clients.
|
||||
// https://docs.aws.amazon.com/sdk-for-go/api/aws/#Config
|
||||
//
|
||||
// See the AWS Price List Service client Pricing for more
|
||||
// information on creating client for this service.
|
||||
// https://docs.aws.amazon.com/sdk-for-go/api/service/pricing/#New
|
||||
package pricing
|
|
@ -0,0 +1,37 @@
|
|||
// Code generated by private/model/cli/gen-api/main.go. DO NOT EDIT.
|
||||
|
||||
package pricing
|
||||
|
||||
const (
|
||||
|
||||
// ErrCodeExpiredNextTokenException for service response error code
|
||||
// "ExpiredNextTokenException".
|
||||
//
|
||||
// The pagination token expired. Try again without a pagination token.
|
||||
ErrCodeExpiredNextTokenException = "ExpiredNextTokenException"
|
||||
|
||||
// ErrCodeInternalErrorException for service response error code
|
||||
// "InternalErrorException".
|
||||
//
|
||||
// An error on the server occurred during the processing of your request. Try
|
||||
// again later.
|
||||
ErrCodeInternalErrorException = "InternalErrorException"
|
||||
|
||||
// ErrCodeInvalidNextTokenException for service response error code
|
||||
// "InvalidNextTokenException".
|
||||
//
|
||||
// The pagination token is invalid. Try again without a pagination token.
|
||||
ErrCodeInvalidNextTokenException = "InvalidNextTokenException"
|
||||
|
||||
// ErrCodeInvalidParameterException for service response error code
|
||||
// "InvalidParameterException".
|
||||
//
|
||||
// One or more parameters had an invalid value.
|
||||
ErrCodeInvalidParameterException = "InvalidParameterException"
|
||||
|
||||
// ErrCodeNotFoundException for service response error code
|
||||
// "NotFoundException".
|
||||
//
|
||||
// The requested resource can't be found.
|
||||
ErrCodeNotFoundException = "NotFoundException"
|
||||
)
|
|
@ -0,0 +1,98 @@
|
|||
// Code generated by private/model/cli/gen-api/main.go. DO NOT EDIT.
|
||||
|
||||
package pricing
|
||||
|
||||
import (
|
||||
"github.com/aws/aws-sdk-go/aws"
|
||||
"github.com/aws/aws-sdk-go/aws/client"
|
||||
"github.com/aws/aws-sdk-go/aws/client/metadata"
|
||||
"github.com/aws/aws-sdk-go/aws/request"
|
||||
"github.com/aws/aws-sdk-go/aws/signer/v4"
|
||||
"github.com/aws/aws-sdk-go/private/protocol/jsonrpc"
|
||||
)
|
||||
|
||||
// Pricing provides the API operation methods for making requests to
|
||||
// AWS Price List Service. See this package's package overview docs
|
||||
// for details on the service.
|
||||
//
|
||||
// Pricing methods are safe to use concurrently. It is not safe to
|
||||
// modify mutate any of the struct's properties though.
|
||||
type Pricing struct {
|
||||
*client.Client
|
||||
}
|
||||
|
||||
// Used for custom client initialization logic
|
||||
var initClient func(*client.Client)
|
||||
|
||||
// Used for custom request initialization logic
|
||||
var initRequest func(*request.Request)
|
||||
|
||||
// Service information constants
|
||||
const (
|
||||
ServiceName = "api.pricing" // Service endpoint prefix API calls made to.
|
||||
EndpointsID = ServiceName // Service ID for Regions and Endpoints metadata.
|
||||
)
|
||||
|
||||
// New creates a new instance of the Pricing client with a session.
|
||||
// If additional configuration is needed for the client instance use the optional
|
||||
// aws.Config parameter to add your extra config.
|
||||
//
|
||||
// Example:
|
||||
// // Create a Pricing client from just a session.
|
||||
// svc := pricing.New(mySession)
|
||||
//
|
||||
// // Create a Pricing client with additional configuration
|
||||
// svc := pricing.New(mySession, aws.NewConfig().WithRegion("us-west-2"))
|
||||
func New(p client.ConfigProvider, cfgs ...*aws.Config) *Pricing {
|
||||
c := p.ClientConfig(EndpointsID, cfgs...)
|
||||
if c.SigningNameDerived || len(c.SigningName) == 0 {
|
||||
c.SigningName = "pricing"
|
||||
}
|
||||
return newClient(*c.Config, c.Handlers, c.Endpoint, c.SigningRegion, c.SigningName)
|
||||
}
|
||||
|
||||
// newClient creates, initializes and returns a new service client instance.
|
||||
func newClient(cfg aws.Config, handlers request.Handlers, endpoint, signingRegion, signingName string) *Pricing {
|
||||
svc := &Pricing{
|
||||
Client: client.New(
|
||||
cfg,
|
||||
metadata.ClientInfo{
|
||||
ServiceName: ServiceName,
|
||||
SigningName: signingName,
|
||||
SigningRegion: signingRegion,
|
||||
Endpoint: endpoint,
|
||||
APIVersion: "2017-10-15",
|
||||
JSONVersion: "1.1",
|
||||
TargetPrefix: "AWSPriceListService",
|
||||
},
|
||||
handlers,
|
||||
),
|
||||
}
|
||||
|
||||
// Handlers
|
||||
svc.Handlers.Sign.PushBackNamed(v4.SignRequestHandler)
|
||||
svc.Handlers.Build.PushBackNamed(jsonrpc.BuildHandler)
|
||||
svc.Handlers.Unmarshal.PushBackNamed(jsonrpc.UnmarshalHandler)
|
||||
svc.Handlers.UnmarshalMeta.PushBackNamed(jsonrpc.UnmarshalMetaHandler)
|
||||
svc.Handlers.UnmarshalError.PushBackNamed(jsonrpc.UnmarshalErrorHandler)
|
||||
|
||||
// Run custom client initialization if present
|
||||
if initClient != nil {
|
||||
initClient(svc.Client)
|
||||
}
|
||||
|
||||
return svc
|
||||
}
|
||||
|
||||
// newRequest creates a new request for a Pricing operation and runs any
|
||||
// custom request initialization.
|
||||
func (c *Pricing) newRequest(op *request.Operation, params, data interface{}) *request.Request {
|
||||
req := c.NewRequest(op, params, data)
|
||||
|
||||
// Run custom request initialization if present
|
||||
if initRequest != nil {
|
||||
initRequest(req)
|
||||
}
|
||||
|
||||
return req
|
||||
}
|
Loading…
Reference in New Issue