diff --git a/cluster-autoscaler/Godeps/Godeps.json b/cluster-autoscaler/Godeps/Godeps.json index 30ff1b339b70..e56378ba280e 100644 --- a/cluster-autoscaler/Godeps/Godeps.json +++ b/cluster-autoscaler/Godeps/Godeps.json @@ -23,43 +23,43 @@ }, { "ImportPath": "github.com/Azure/azure-sdk-for-go/services/compute/mgmt/2018-10-01/compute", - "Comment": "v21.3.0-1-g541abcba", - "Rev": "541abcbad0801b2e0dc34980ba43c385c082338f" + "Comment": "v21.3.0-1-g33832ab67", + "Rev": "33832ab67033fd6d0dd826ea5c6f3f512a7e7e7c" }, { "ImportPath": "github.com/Azure/azure-sdk-for-go/services/containerregistry/mgmt/2017-10-01/containerregistry", - "Comment": "v21.3.0-1-g541abcba", - "Rev": "541abcbad0801b2e0dc34980ba43c385c082338f" + "Comment": "v21.3.0-1-g33832ab67", + "Rev": "33832ab67033fd6d0dd826ea5c6f3f512a7e7e7c" }, { "ImportPath": "github.com/Azure/azure-sdk-for-go/services/containerservice/mgmt/2018-03-31/containerservice", - "Comment": "v21.3.0-1-g541abcba", - "Rev": "541abcbad0801b2e0dc34980ba43c385c082338f" + "Comment": "v21.3.0-1-g33832ab67", + "Rev": "33832ab67033fd6d0dd826ea5c6f3f512a7e7e7c" }, { "ImportPath": "github.com/Azure/azure-sdk-for-go/services/network/mgmt/2017-09-01/network", - "Comment": "v21.3.0-1-g541abcba", - "Rev": "541abcbad0801b2e0dc34980ba43c385c082338f" + "Comment": "v21.3.0-1-g33832ab67", + "Rev": "33832ab67033fd6d0dd826ea5c6f3f512a7e7e7c" }, { "ImportPath": "github.com/Azure/azure-sdk-for-go/services/resources/mgmt/2017-05-10/resources", - "Comment": "v21.3.0-1-g541abcba", - "Rev": "541abcbad0801b2e0dc34980ba43c385c082338f" + "Comment": "v21.3.0-1-g33832ab67", + "Rev": "33832ab67033fd6d0dd826ea5c6f3f512a7e7e7c" }, { "ImportPath": "github.com/Azure/azure-sdk-for-go/services/storage/mgmt/2018-07-01/storage", - "Comment": "v21.3.0-1-g541abcba", - "Rev": "541abcbad0801b2e0dc34980ba43c385c082338f" + "Comment": "v21.3.0-1-g33832ab67", + "Rev": "33832ab67033fd6d0dd826ea5c6f3f512a7e7e7c" }, { "ImportPath": "github.com/Azure/azure-sdk-for-go/storage", - "Comment": "v21.3.0-1-g541abcba", - "Rev": "541abcbad0801b2e0dc34980ba43c385c082338f" + "Comment": "v21.3.0-1-g33832ab67", + "Rev": "33832ab67033fd6d0dd826ea5c6f3f512a7e7e7c" }, { "ImportPath": "github.com/Azure/azure-sdk-for-go/version", - "Comment": "v21.3.0-1-g541abcba", - "Rev": "541abcbad0801b2e0dc34980ba43c385c082338f" + "Comment": "v21.3.0-1-g33832ab67", + "Rev": "33832ab67033fd6d0dd826ea5c6f3f512a7e7e7c" }, { "ImportPath": "github.com/Azure/go-ansiterm", @@ -71,33 +71,33 @@ }, { "ImportPath": "github.com/Azure/go-autorest/autorest", - "Comment": "v11.1.0-1-g8b706c1", - "Rev": "8b706c11479dcb28f316d424c2a0fa93311debe3" + "Comment": "v11.1.0-1-g60305e4", + "Rev": "60305e4d6b37fcd9cd93948d2770c7920e88d69f" }, { "ImportPath": "github.com/Azure/go-autorest/autorest/adal", - "Comment": "v11.1.0-1-g8b706c1", - "Rev": "8b706c11479dcb28f316d424c2a0fa93311debe3" + "Comment": "v11.1.0-1-g60305e4", + "Rev": "60305e4d6b37fcd9cd93948d2770c7920e88d69f" }, { "ImportPath": "github.com/Azure/go-autorest/autorest/azure", - "Comment": "v11.1.0-1-g8b706c1", - "Rev": "8b706c11479dcb28f316d424c2a0fa93311debe3" + "Comment": "v11.1.0-1-g60305e4", + "Rev": "60305e4d6b37fcd9cd93948d2770c7920e88d69f" }, { "ImportPath": "github.com/Azure/go-autorest/autorest/date", - "Comment": "v11.1.0-1-g8b706c1", - "Rev": "8b706c11479dcb28f316d424c2a0fa93311debe3" + "Comment": "v11.1.0-1-g60305e4", + "Rev": "60305e4d6b37fcd9cd93948d2770c7920e88d69f" }, { "ImportPath": "github.com/Azure/go-autorest/autorest/to", - "Comment": "v11.1.0-1-g8b706c1", - "Rev": "8b706c11479dcb28f316d424c2a0fa93311debe3" + "Comment": "v11.1.0-1-g60305e4", + "Rev": "60305e4d6b37fcd9cd93948d2770c7920e88d69f" }, { "ImportPath": "github.com/Azure/go-autorest/autorest/validation", - "Comment": "v11.1.0-1-g8b706c1", - "Rev": "8b706c11479dcb28f316d424c2a0fa93311debe3" + "Comment": "v11.1.0-1-g60305e4", + "Rev": "60305e4d6b37fcd9cd93948d2770c7920e88d69f" }, { "ImportPath": "github.com/JeffAshton/win_pdh", @@ -161,178 +161,183 @@ }, { "ImportPath": "github.com/aws/aws-sdk-go/aws", - "Comment": "v1.14.12-2-g906be003", - "Rev": "906be00371d06cae3e024fe094c69cc7960436f5" + "Comment": "v1.14.12-2-g329497a5", + "Rev": "329497a5f86a3433730c7e35a532c9be566d7b6d" }, { "ImportPath": "github.com/aws/aws-sdk-go/aws/awserr", - "Comment": "v1.14.12-2-g906be003", - "Rev": "906be00371d06cae3e024fe094c69cc7960436f5" + "Comment": "v1.14.12-2-g329497a5", + "Rev": "329497a5f86a3433730c7e35a532c9be566d7b6d" }, { "ImportPath": "github.com/aws/aws-sdk-go/aws/awsutil", - "Comment": "v1.14.12-2-g906be003", - "Rev": "906be00371d06cae3e024fe094c69cc7960436f5" + "Comment": "v1.14.12-2-g329497a5", + "Rev": "329497a5f86a3433730c7e35a532c9be566d7b6d" }, { "ImportPath": "github.com/aws/aws-sdk-go/aws/client", - "Comment": "v1.14.12-2-g906be003", - "Rev": "906be00371d06cae3e024fe094c69cc7960436f5" + "Comment": "v1.14.12-2-g329497a5", + "Rev": "329497a5f86a3433730c7e35a532c9be566d7b6d" }, { "ImportPath": "github.com/aws/aws-sdk-go/aws/client/metadata", - "Comment": "v1.14.12-2-g906be003", - "Rev": "906be00371d06cae3e024fe094c69cc7960436f5" + "Comment": "v1.14.12-2-g329497a5", + "Rev": "329497a5f86a3433730c7e35a532c9be566d7b6d" }, { "ImportPath": "github.com/aws/aws-sdk-go/aws/corehandlers", - "Comment": "v1.14.12-2-g906be003", - "Rev": "906be00371d06cae3e024fe094c69cc7960436f5" + "Comment": "v1.14.12-2-g329497a5", + "Rev": "329497a5f86a3433730c7e35a532c9be566d7b6d" }, { "ImportPath": "github.com/aws/aws-sdk-go/aws/credentials", - "Comment": "v1.14.12-2-g906be003", - "Rev": "906be00371d06cae3e024fe094c69cc7960436f5" + "Comment": "v1.14.12-2-g329497a5", + "Rev": "329497a5f86a3433730c7e35a532c9be566d7b6d" }, { "ImportPath": "github.com/aws/aws-sdk-go/aws/credentials/ec2rolecreds", - "Comment": "v1.14.12-2-g906be003", - "Rev": "906be00371d06cae3e024fe094c69cc7960436f5" + "Comment": "v1.14.12-2-g329497a5", + "Rev": "329497a5f86a3433730c7e35a532c9be566d7b6d" }, { "ImportPath": "github.com/aws/aws-sdk-go/aws/credentials/endpointcreds", - "Comment": "v1.14.12-2-g906be003", - "Rev": "906be00371d06cae3e024fe094c69cc7960436f5" + "Comment": "v1.14.12-2-g329497a5", + "Rev": "329497a5f86a3433730c7e35a532c9be566d7b6d" }, { "ImportPath": "github.com/aws/aws-sdk-go/aws/credentials/stscreds", - "Comment": "v1.14.12-2-g906be003", - "Rev": "906be00371d06cae3e024fe094c69cc7960436f5" + "Comment": "v1.14.12-2-g329497a5", + "Rev": "329497a5f86a3433730c7e35a532c9be566d7b6d" }, { "ImportPath": "github.com/aws/aws-sdk-go/aws/csm", - "Comment": "v1.14.12-2-g906be003", - "Rev": "906be00371d06cae3e024fe094c69cc7960436f5" + "Comment": "v1.14.12-2-g329497a5", + "Rev": "329497a5f86a3433730c7e35a532c9be566d7b6d" }, { "ImportPath": "github.com/aws/aws-sdk-go/aws/defaults", - "Comment": "v1.14.12-2-g906be003", - "Rev": "906be00371d06cae3e024fe094c69cc7960436f5" + "Comment": "v1.14.12-2-g329497a5", + "Rev": "329497a5f86a3433730c7e35a532c9be566d7b6d" }, { "ImportPath": "github.com/aws/aws-sdk-go/aws/ec2metadata", - "Comment": "v1.14.12-2-g906be003", - "Rev": "906be00371d06cae3e024fe094c69cc7960436f5" + "Comment": "v1.14.12-2-g329497a5", + "Rev": "329497a5f86a3433730c7e35a532c9be566d7b6d" }, { "ImportPath": "github.com/aws/aws-sdk-go/aws/endpoints", - "Comment": "v1.14.12-2-g906be003", - "Rev": "906be00371d06cae3e024fe094c69cc7960436f5" + "Comment": "v1.14.12-2-g329497a5", + "Rev": "329497a5f86a3433730c7e35a532c9be566d7b6d" }, { "ImportPath": "github.com/aws/aws-sdk-go/aws/request", - "Comment": "v1.14.12-2-g906be003", - "Rev": "906be00371d06cae3e024fe094c69cc7960436f5" + "Comment": "v1.14.12-2-g329497a5", + "Rev": "329497a5f86a3433730c7e35a532c9be566d7b6d" }, { "ImportPath": "github.com/aws/aws-sdk-go/aws/session", - "Comment": "v1.14.12-2-g906be003", - "Rev": "906be00371d06cae3e024fe094c69cc7960436f5" + "Comment": "v1.14.12-2-g329497a5", + "Rev": "329497a5f86a3433730c7e35a532c9be566d7b6d" }, { "ImportPath": "github.com/aws/aws-sdk-go/aws/signer/v4", - "Comment": "v1.14.12-2-g906be003", - "Rev": "906be00371d06cae3e024fe094c69cc7960436f5" + "Comment": "v1.14.12-2-g329497a5", + "Rev": "329497a5f86a3433730c7e35a532c9be566d7b6d" }, { "ImportPath": "github.com/aws/aws-sdk-go/internal/sdkio", - "Comment": "v1.14.12-2-g906be003", - "Rev": "906be00371d06cae3e024fe094c69cc7960436f5" + "Comment": "v1.14.12-2-g329497a5", + "Rev": "329497a5f86a3433730c7e35a532c9be566d7b6d" }, { "ImportPath": "github.com/aws/aws-sdk-go/internal/sdkrand", - "Comment": "v1.14.12-2-g906be003", - "Rev": "906be00371d06cae3e024fe094c69cc7960436f5" + "Comment": "v1.14.12-2-g329497a5", + "Rev": "329497a5f86a3433730c7e35a532c9be566d7b6d" }, { "ImportPath": "github.com/aws/aws-sdk-go/internal/shareddefaults", - "Comment": "v1.14.12-2-g906be003", - "Rev": "906be00371d06cae3e024fe094c69cc7960436f5" + "Comment": "v1.14.12-2-g329497a5", + "Rev": "329497a5f86a3433730c7e35a532c9be566d7b6d" }, { "ImportPath": "github.com/aws/aws-sdk-go/private/protocol", - "Comment": "v1.14.12-2-g906be003", - "Rev": "906be00371d06cae3e024fe094c69cc7960436f5" + "Comment": "v1.14.12-2-g329497a5", + "Rev": "329497a5f86a3433730c7e35a532c9be566d7b6d" }, { "ImportPath": "github.com/aws/aws-sdk-go/private/protocol/ec2query", - "Comment": "v1.14.12-2-g906be003", - "Rev": "906be00371d06cae3e024fe094c69cc7960436f5" + "Comment": "v1.14.12-2-g329497a5", + "Rev": "329497a5f86a3433730c7e35a532c9be566d7b6d" }, { "ImportPath": "github.com/aws/aws-sdk-go/private/protocol/json/jsonutil", - "Comment": "v1.14.12-2-g906be003", - "Rev": "906be00371d06cae3e024fe094c69cc7960436f5" + "Comment": "v1.14.12-2-g329497a5", + "Rev": "329497a5f86a3433730c7e35a532c9be566d7b6d" }, { "ImportPath": "github.com/aws/aws-sdk-go/private/protocol/jsonrpc", - "Comment": "v1.14.12-2-g906be003", - "Rev": "906be00371d06cae3e024fe094c69cc7960436f5" + "Comment": "v1.14.12-2-g329497a5", + "Rev": "329497a5f86a3433730c7e35a532c9be566d7b6d" }, { "ImportPath": "github.com/aws/aws-sdk-go/private/protocol/query", - "Comment": "v1.14.12-2-g906be003", - "Rev": "906be00371d06cae3e024fe094c69cc7960436f5" + "Comment": "v1.14.12-2-g329497a5", + "Rev": "329497a5f86a3433730c7e35a532c9be566d7b6d" }, { "ImportPath": "github.com/aws/aws-sdk-go/private/protocol/query/queryutil", - "Comment": "v1.14.12-2-g906be003", - "Rev": "906be00371d06cae3e024fe094c69cc7960436f5" + "Comment": "v1.14.12-2-g329497a5", + "Rev": "329497a5f86a3433730c7e35a532c9be566d7b6d" }, { "ImportPath": "github.com/aws/aws-sdk-go/private/protocol/rest", - "Comment": "v1.14.12-2-g906be003", - "Rev": "906be00371d06cae3e024fe094c69cc7960436f5" + "Comment": "v1.14.12-2-g329497a5", + "Rev": "329497a5f86a3433730c7e35a532c9be566d7b6d" }, { "ImportPath": "github.com/aws/aws-sdk-go/private/protocol/xml/xmlutil", - "Comment": "v1.14.12-2-g906be003", - "Rev": "906be00371d06cae3e024fe094c69cc7960436f5" + "Comment": "v1.14.12-2-g329497a5", + "Rev": "329497a5f86a3433730c7e35a532c9be566d7b6d" }, { "ImportPath": "github.com/aws/aws-sdk-go/service/autoscaling", - "Comment": "v1.14.12-2-g906be003", - "Rev": "906be00371d06cae3e024fe094c69cc7960436f5" + "Comment": "v1.14.12-2-g329497a5", + "Rev": "329497a5f86a3433730c7e35a532c9be566d7b6d" }, { "ImportPath": "github.com/aws/aws-sdk-go/service/ec2", - "Comment": "v1.14.12-2-g906be003", - "Rev": "906be00371d06cae3e024fe094c69cc7960436f5" + "Comment": "v1.14.12-2-g329497a5", + "Rev": "329497a5f86a3433730c7e35a532c9be566d7b6d" }, { "ImportPath": "github.com/aws/aws-sdk-go/service/ecr", - "Comment": "v1.14.12-2-g906be003", - "Rev": "906be00371d06cae3e024fe094c69cc7960436f5" + "Comment": "v1.14.12-2-g329497a5", + "Rev": "329497a5f86a3433730c7e35a532c9be566d7b6d" }, { "ImportPath": "github.com/aws/aws-sdk-go/service/elb", - "Comment": "v1.14.12-2-g906be003", - "Rev": "906be00371d06cae3e024fe094c69cc7960436f5" + "Comment": "v1.14.12-2-g329497a5", + "Rev": "329497a5f86a3433730c7e35a532c9be566d7b6d" }, { "ImportPath": "github.com/aws/aws-sdk-go/service/elbv2", - "Comment": "v1.14.12-2-g906be003", - "Rev": "906be00371d06cae3e024fe094c69cc7960436f5" + "Comment": "v1.14.12-2-g329497a5", + "Rev": "329497a5f86a3433730c7e35a532c9be566d7b6d" }, { "ImportPath": "github.com/aws/aws-sdk-go/service/kms", - "Comment": "v1.14.12-2-g906be003", - "Rev": "906be00371d06cae3e024fe094c69cc7960436f5" + "Comment": "v1.14.12-2-g329497a5", + "Rev": "329497a5f86a3433730c7e35a532c9be566d7b6d" + }, + { + "ImportPath": "github.com/aws/aws-sdk-go/service/pricing", + "Comment": "v1.14.12-2-g329497a5", + "Rev": "329497a5f86a3433730c7e35a532c9be566d7b6d" }, { "ImportPath": "github.com/aws/aws-sdk-go/service/sts", - "Comment": "v1.14.12-2-g906be003", - "Rev": "906be00371d06cae3e024fe094c69cc7960436f5" + "Comment": "v1.14.12-2-g329497a5", + "Rev": "329497a5f86a3433730c7e35a532c9be566d7b6d" }, { "ImportPath": "github.com/beorn7/perks/quantile", @@ -366,78 +371,78 @@ }, { "ImportPath": "github.com/containerd/containerd/api/services/containers/v1", - "Comment": "v1.0.2-1-g7f2e11d2", - "Rev": "7f2e11d2526dbba7f86118880342dbc004961949" + "Comment": "v1.0.2-1-g64b5196d", + "Rev": "64b5196df45f37570fac946524056c35009f19f8" }, { "ImportPath": "github.com/containerd/containerd/api/services/tasks/v1", - "Comment": "v1.0.2-1-g7f2e11d2", - "Rev": "7f2e11d2526dbba7f86118880342dbc004961949" + "Comment": "v1.0.2-1-g64b5196d", + "Rev": "64b5196df45f37570fac946524056c35009f19f8" }, { "ImportPath": "github.com/containerd/containerd/api/services/version/v1", - "Comment": "v1.0.2-1-g7f2e11d2", - "Rev": "7f2e11d2526dbba7f86118880342dbc004961949" + "Comment": "v1.0.2-1-g64b5196d", + "Rev": "64b5196df45f37570fac946524056c35009f19f8" }, { "ImportPath": "github.com/containerd/containerd/api/types", - "Comment": "v1.0.2-1-g7f2e11d2", - "Rev": "7f2e11d2526dbba7f86118880342dbc004961949" + "Comment": "v1.0.2-1-g64b5196d", + "Rev": "64b5196df45f37570fac946524056c35009f19f8" }, { "ImportPath": "github.com/containerd/containerd/api/types/task", - "Comment": "v1.0.2-1-g7f2e11d2", - "Rev": "7f2e11d2526dbba7f86118880342dbc004961949" + "Comment": "v1.0.2-1-g64b5196d", + "Rev": "64b5196df45f37570fac946524056c35009f19f8" }, { "ImportPath": "github.com/containerd/containerd/containers", - "Comment": "v1.0.2-1-g7f2e11d2", - "Rev": "7f2e11d2526dbba7f86118880342dbc004961949" + "Comment": "v1.0.2-1-g64b5196d", + "Rev": "64b5196df45f37570fac946524056c35009f19f8" }, { "ImportPath": "github.com/containerd/containerd/dialer", - "Comment": "v1.0.2-1-g7f2e11d2", - "Rev": "7f2e11d2526dbba7f86118880342dbc004961949" + "Comment": "v1.0.2-1-g64b5196d", + "Rev": "64b5196df45f37570fac946524056c35009f19f8" }, { "ImportPath": "github.com/containerd/containerd/errdefs", - "Comment": "v1.0.2-1-g7f2e11d2", - "Rev": "7f2e11d2526dbba7f86118880342dbc004961949" + "Comment": "v1.0.2-1-g64b5196d", + "Rev": "64b5196df45f37570fac946524056c35009f19f8" }, { "ImportPath": "github.com/containerd/containerd/namespaces", - "Comment": "v1.0.2-1-g7f2e11d2", - "Rev": "7f2e11d2526dbba7f86118880342dbc004961949" + "Comment": "v1.0.2-1-g64b5196d", + "Rev": "64b5196df45f37570fac946524056c35009f19f8" }, { "ImportPath": "github.com/containernetworking/cni/libcni", - "Comment": "v0.6.0-1-ge19c0b4", - "Rev": "e19c0b4e864458a5093666d860b98145d47b39e1" + "Comment": "v0.6.0-1-gb45b1ab", + "Rev": "b45b1ab5d60969c49999271d29da2f4acfe79699" }, { "ImportPath": "github.com/containernetworking/cni/pkg/invoke", - "Comment": "v0.6.0-1-ge19c0b4", - "Rev": "e19c0b4e864458a5093666d860b98145d47b39e1" + "Comment": "v0.6.0-1-gb45b1ab", + "Rev": "b45b1ab5d60969c49999271d29da2f4acfe79699" }, { "ImportPath": "github.com/containernetworking/cni/pkg/types", - "Comment": "v0.6.0-1-ge19c0b4", - "Rev": "e19c0b4e864458a5093666d860b98145d47b39e1" + "Comment": "v0.6.0-1-gb45b1ab", + "Rev": "b45b1ab5d60969c49999271d29da2f4acfe79699" }, { "ImportPath": "github.com/containernetworking/cni/pkg/types/020", - "Comment": "v0.6.0-1-ge19c0b4", - "Rev": "e19c0b4e864458a5093666d860b98145d47b39e1" + "Comment": "v0.6.0-1-gb45b1ab", + "Rev": "b45b1ab5d60969c49999271d29da2f4acfe79699" }, { "ImportPath": "github.com/containernetworking/cni/pkg/types/current", - "Comment": "v0.6.0-1-ge19c0b4", - "Rev": "e19c0b4e864458a5093666d860b98145d47b39e1" + "Comment": "v0.6.0-1-gb45b1ab", + "Rev": "b45b1ab5d60969c49999271d29da2f4acfe79699" }, { "ImportPath": "github.com/containernetworking/cni/pkg/version", - "Comment": "v0.6.0-1-ge19c0b4", - "Rev": "e19c0b4e864458a5093666d860b98145d47b39e1" + "Comment": "v0.6.0-1-gb45b1ab", + "Rev": "b45b1ab5d60969c49999271d29da2f4acfe79699" }, { "ImportPath": "github.com/coreos/go-systemd/daemon", @@ -461,13 +466,13 @@ }, { "ImportPath": "github.com/coreos/rkt/api/v1alpha", - "Comment": "v1.25.0-1-gf898f945", - "Rev": "f898f9450e8cba9688f916f389d5985675dbf39b" + "Comment": "v1.25.0-1-g3134694e", + "Rev": "3134694e384e8859e7eaf3867f6a9b4abb4d1672" }, { "ImportPath": "github.com/cyphar/filepath-securejoin", - "Comment": "v0.2.1-2-g0be6c49", - "Rev": "0be6c49ab9064879b3899eb0638bd472c0277151" + "Comment": "v0.2.1-2-ge080d7b", + "Rev": "e080d7b5dad1387bf3cc9fb5fc0607682366f109" }, { "ImportPath": "github.com/d2g/dhcp4", @@ -489,143 +494,143 @@ }, { "ImportPath": "github.com/docker/distribution/digestset", - "Comment": "v2.6.0-rc.1-210-gb869bb2f", - "Rev": "b869bb2f3c53614bf8accdf7ab61f0ecbe5a5a3e" + "Comment": "v2.6.0-rc.1-210-ga287c716", + "Rev": "a287c716525dc05181b6dc22473d5459b947b187" }, { "ImportPath": "github.com/docker/distribution/reference", - "Comment": "v2.6.0-rc.1-210-gb869bb2f", - "Rev": "b869bb2f3c53614bf8accdf7ab61f0ecbe5a5a3e" + "Comment": "v2.6.0-rc.1-210-ga287c716", + "Rev": "a287c716525dc05181b6dc22473d5459b947b187" }, { "ImportPath": "github.com/docker/docker/api", - "Comment": "docs-v1.12.0-rc4-2016-07-15-9512-gd2f424ca26", - "Rev": "d2f424ca262112caddce2aa0ba4ea508109f40d1" + "Comment": "docs-v1.12.0-rc4-2016-07-15-9512-g24c13d4d18", + "Rev": "24c13d4d1885108d79d432115608246603a7d96b" }, { "ImportPath": "github.com/docker/docker/api/types", - "Comment": "docs-v1.12.0-rc4-2016-07-15-9512-gd2f424ca26", - "Rev": "d2f424ca262112caddce2aa0ba4ea508109f40d1" + "Comment": "docs-v1.12.0-rc4-2016-07-15-9512-g24c13d4d18", + "Rev": "24c13d4d1885108d79d432115608246603a7d96b" }, { "ImportPath": "github.com/docker/docker/api/types/blkiodev", - "Comment": "docs-v1.12.0-rc4-2016-07-15-9512-gd2f424ca26", - "Rev": "d2f424ca262112caddce2aa0ba4ea508109f40d1" + "Comment": "docs-v1.12.0-rc4-2016-07-15-9512-g24c13d4d18", + "Rev": "24c13d4d1885108d79d432115608246603a7d96b" }, { "ImportPath": "github.com/docker/docker/api/types/container", - "Comment": "docs-v1.12.0-rc4-2016-07-15-9512-gd2f424ca26", - "Rev": "d2f424ca262112caddce2aa0ba4ea508109f40d1" + "Comment": "docs-v1.12.0-rc4-2016-07-15-9512-g24c13d4d18", + "Rev": "24c13d4d1885108d79d432115608246603a7d96b" }, { "ImportPath": "github.com/docker/docker/api/types/events", - "Comment": "docs-v1.12.0-rc4-2016-07-15-9512-gd2f424ca26", - "Rev": "d2f424ca262112caddce2aa0ba4ea508109f40d1" + "Comment": "docs-v1.12.0-rc4-2016-07-15-9512-g24c13d4d18", + "Rev": "24c13d4d1885108d79d432115608246603a7d96b" }, { "ImportPath": "github.com/docker/docker/api/types/filters", - "Comment": "docs-v1.12.0-rc4-2016-07-15-9512-gd2f424ca26", - "Rev": "d2f424ca262112caddce2aa0ba4ea508109f40d1" + "Comment": "docs-v1.12.0-rc4-2016-07-15-9512-g24c13d4d18", + "Rev": "24c13d4d1885108d79d432115608246603a7d96b" }, { "ImportPath": "github.com/docker/docker/api/types/image", - "Comment": "docs-v1.12.0-rc4-2016-07-15-9512-gd2f424ca26", - "Rev": "d2f424ca262112caddce2aa0ba4ea508109f40d1" + "Comment": "docs-v1.12.0-rc4-2016-07-15-9512-g24c13d4d18", + "Rev": "24c13d4d1885108d79d432115608246603a7d96b" }, { "ImportPath": "github.com/docker/docker/api/types/mount", - "Comment": "docs-v1.12.0-rc4-2016-07-15-9512-gd2f424ca26", - "Rev": "d2f424ca262112caddce2aa0ba4ea508109f40d1" + "Comment": "docs-v1.12.0-rc4-2016-07-15-9512-g24c13d4d18", + "Rev": "24c13d4d1885108d79d432115608246603a7d96b" }, { "ImportPath": "github.com/docker/docker/api/types/network", - "Comment": "docs-v1.12.0-rc4-2016-07-15-9512-gd2f424ca26", - "Rev": "d2f424ca262112caddce2aa0ba4ea508109f40d1" + "Comment": "docs-v1.12.0-rc4-2016-07-15-9512-g24c13d4d18", + "Rev": "24c13d4d1885108d79d432115608246603a7d96b" }, { "ImportPath": "github.com/docker/docker/api/types/registry", - "Comment": "docs-v1.12.0-rc4-2016-07-15-9512-gd2f424ca26", - "Rev": "d2f424ca262112caddce2aa0ba4ea508109f40d1" + "Comment": "docs-v1.12.0-rc4-2016-07-15-9512-g24c13d4d18", + "Rev": "24c13d4d1885108d79d432115608246603a7d96b" }, { "ImportPath": "github.com/docker/docker/api/types/strslice", - "Comment": "docs-v1.12.0-rc4-2016-07-15-9512-gd2f424ca26", - "Rev": "d2f424ca262112caddce2aa0ba4ea508109f40d1" + "Comment": "docs-v1.12.0-rc4-2016-07-15-9512-g24c13d4d18", + "Rev": "24c13d4d1885108d79d432115608246603a7d96b" }, { "ImportPath": "github.com/docker/docker/api/types/swarm", - "Comment": "docs-v1.12.0-rc4-2016-07-15-9512-gd2f424ca26", - "Rev": "d2f424ca262112caddce2aa0ba4ea508109f40d1" + "Comment": "docs-v1.12.0-rc4-2016-07-15-9512-g24c13d4d18", + "Rev": "24c13d4d1885108d79d432115608246603a7d96b" }, { "ImportPath": "github.com/docker/docker/api/types/swarm/runtime", - "Comment": "docs-v1.12.0-rc4-2016-07-15-9512-gd2f424ca26", - "Rev": "d2f424ca262112caddce2aa0ba4ea508109f40d1" + "Comment": "docs-v1.12.0-rc4-2016-07-15-9512-g24c13d4d18", + "Rev": "24c13d4d1885108d79d432115608246603a7d96b" }, { "ImportPath": "github.com/docker/docker/api/types/time", - "Comment": "docs-v1.12.0-rc4-2016-07-15-9512-gd2f424ca26", - "Rev": "d2f424ca262112caddce2aa0ba4ea508109f40d1" + "Comment": "docs-v1.12.0-rc4-2016-07-15-9512-g24c13d4d18", + "Rev": "24c13d4d1885108d79d432115608246603a7d96b" }, { "ImportPath": "github.com/docker/docker/api/types/versions", - "Comment": "docs-v1.12.0-rc4-2016-07-15-9512-gd2f424ca26", - "Rev": "d2f424ca262112caddce2aa0ba4ea508109f40d1" + "Comment": "docs-v1.12.0-rc4-2016-07-15-9512-g24c13d4d18", + "Rev": "24c13d4d1885108d79d432115608246603a7d96b" }, { "ImportPath": "github.com/docker/docker/api/types/volume", - "Comment": "docs-v1.12.0-rc4-2016-07-15-9512-gd2f424ca26", - "Rev": "d2f424ca262112caddce2aa0ba4ea508109f40d1" + "Comment": "docs-v1.12.0-rc4-2016-07-15-9512-g24c13d4d18", + "Rev": "24c13d4d1885108d79d432115608246603a7d96b" }, { "ImportPath": "github.com/docker/docker/client", - "Comment": "docs-v1.12.0-rc4-2016-07-15-9512-gd2f424ca26", - "Rev": "d2f424ca262112caddce2aa0ba4ea508109f40d1" + "Comment": "docs-v1.12.0-rc4-2016-07-15-9512-g24c13d4d18", + "Rev": "24c13d4d1885108d79d432115608246603a7d96b" }, { "ImportPath": "github.com/docker/docker/daemon/logger/jsonfilelog/jsonlog", - "Comment": "docs-v1.12.0-rc4-2016-07-15-9512-gd2f424ca26", - "Rev": "d2f424ca262112caddce2aa0ba4ea508109f40d1" + "Comment": "docs-v1.12.0-rc4-2016-07-15-9512-g24c13d4d18", + "Rev": "24c13d4d1885108d79d432115608246603a7d96b" }, { "ImportPath": "github.com/docker/docker/pkg/jsonmessage", - "Comment": "docs-v1.12.0-rc4-2016-07-15-9512-gd2f424ca26", - "Rev": "d2f424ca262112caddce2aa0ba4ea508109f40d1" + "Comment": "docs-v1.12.0-rc4-2016-07-15-9512-g24c13d4d18", + "Rev": "24c13d4d1885108d79d432115608246603a7d96b" }, { "ImportPath": "github.com/docker/docker/pkg/mount", - "Comment": "docs-v1.12.0-rc4-2016-07-15-9512-gd2f424ca26", - "Rev": "d2f424ca262112caddce2aa0ba4ea508109f40d1" + "Comment": "docs-v1.12.0-rc4-2016-07-15-9512-g24c13d4d18", + "Rev": "24c13d4d1885108d79d432115608246603a7d96b" }, { "ImportPath": "github.com/docker/docker/pkg/parsers", - "Comment": "docs-v1.12.0-rc4-2016-07-15-9512-gd2f424ca26", - "Rev": "d2f424ca262112caddce2aa0ba4ea508109f40d1" + "Comment": "docs-v1.12.0-rc4-2016-07-15-9512-g24c13d4d18", + "Rev": "24c13d4d1885108d79d432115608246603a7d96b" }, { "ImportPath": "github.com/docker/docker/pkg/parsers/operatingsystem", - "Comment": "docs-v1.12.0-rc4-2016-07-15-9512-gd2f424ca26", - "Rev": "d2f424ca262112caddce2aa0ba4ea508109f40d1" + "Comment": "docs-v1.12.0-rc4-2016-07-15-9512-g24c13d4d18", + "Rev": "24c13d4d1885108d79d432115608246603a7d96b" }, { "ImportPath": "github.com/docker/docker/pkg/stdcopy", - "Comment": "docs-v1.12.0-rc4-2016-07-15-9512-gd2f424ca26", - "Rev": "d2f424ca262112caddce2aa0ba4ea508109f40d1" + "Comment": "docs-v1.12.0-rc4-2016-07-15-9512-g24c13d4d18", + "Rev": "24c13d4d1885108d79d432115608246603a7d96b" }, { "ImportPath": "github.com/docker/docker/pkg/sysinfo", - "Comment": "docs-v1.12.0-rc4-2016-07-15-9512-gd2f424ca26", - "Rev": "d2f424ca262112caddce2aa0ba4ea508109f40d1" + "Comment": "docs-v1.12.0-rc4-2016-07-15-9512-g24c13d4d18", + "Rev": "24c13d4d1885108d79d432115608246603a7d96b" }, { "ImportPath": "github.com/docker/docker/pkg/term", - "Comment": "docs-v1.12.0-rc4-2016-07-15-9512-gd2f424ca26", - "Rev": "d2f424ca262112caddce2aa0ba4ea508109f40d1" + "Comment": "docs-v1.12.0-rc4-2016-07-15-9512-g24c13d4d18", + "Rev": "24c13d4d1885108d79d432115608246603a7d96b" }, { "ImportPath": "github.com/docker/docker/pkg/term/windows", - "Comment": "docs-v1.12.0-rc4-2016-07-15-9512-gd2f424ca26", - "Rev": "d2f424ca262112caddce2aa0ba4ea508109f40d1" + "Comment": "docs-v1.12.0-rc4-2016-07-15-9512-g24c13d4d18", + "Rev": "24c13d4d1885108d79d432115608246603a7d96b" }, { "ImportPath": "github.com/docker/go-connections/nat", @@ -649,8 +654,8 @@ }, { "ImportPath": "github.com/docker/libnetwork/ipvs", - "Comment": "v0.8.0-dev.2-1266-gbc9ffbdb", - "Rev": "bc9ffbdbb964ca6742b58364e45453e85d634bb0" + "Comment": "v0.8.0-dev.2-1266-g1c68e497", + "Rev": "1c68e497056216b0d9203c7968189004721cf6f6" }, { "ImportPath": "github.com/docker/spdystream", @@ -710,12 +715,12 @@ }, { "ImportPath": "github.com/go-openapi/jsonpointer", - "Comment": "v0.17.2", + "Comment": "v0.18.0", "Rev": "ef5f0afec364d3b9396b7b77b43dbe26bf1f8004" }, { "ImportPath": "github.com/go-openapi/jsonreference", - "Comment": "v0.17.2", + "Comment": "v0.18.0", "Rev": "8483a886a90412cd6858df4ea3483dce9c8e35a3" }, { @@ -768,6 +773,10 @@ "Comment": "v0.5", "Rev": "342cbe0a04158f6dcb03ca0079991a51a4248c02" }, + { + "ImportPath": "github.com/golang/glog", + "Rev": "23def4e6c14b4da8ac2ed8007337bc5eb5007998" + }, { "ImportPath": "github.com/golang/groupcache/lru", "Rev": "02826c3e79038b59d737d3b1c0a1d937f71a4433" @@ -817,183 +826,183 @@ }, { "ImportPath": "github.com/google/cadvisor/accelerators", - "Comment": "v0.32.0-1-g71f4d3db", - "Rev": "71f4d3dba95580556293597df2661f746e18481b" + "Comment": "v0.32.0-1-gc79add0e", + "Rev": "c79add0e72c545fe050a534aab35833c657c593e" }, { "ImportPath": "github.com/google/cadvisor/cache/memory", - "Comment": "v0.32.0-1-g71f4d3db", - "Rev": "71f4d3dba95580556293597df2661f746e18481b" + "Comment": "v0.32.0-1-gc79add0e", + "Rev": "c79add0e72c545fe050a534aab35833c657c593e" }, { "ImportPath": "github.com/google/cadvisor/collector", - "Comment": "v0.32.0-1-g71f4d3db", - "Rev": "71f4d3dba95580556293597df2661f746e18481b" + "Comment": "v0.32.0-1-gc79add0e", + "Rev": "c79add0e72c545fe050a534aab35833c657c593e" }, { "ImportPath": "github.com/google/cadvisor/container", - "Comment": "v0.32.0-1-g71f4d3db", - "Rev": "71f4d3dba95580556293597df2661f746e18481b" + "Comment": "v0.32.0-1-gc79add0e", + "Rev": "c79add0e72c545fe050a534aab35833c657c593e" }, { "ImportPath": "github.com/google/cadvisor/container/common", - "Comment": "v0.32.0-1-g71f4d3db", - "Rev": "71f4d3dba95580556293597df2661f746e18481b" + "Comment": "v0.32.0-1-gc79add0e", + "Rev": "c79add0e72c545fe050a534aab35833c657c593e" }, { "ImportPath": "github.com/google/cadvisor/container/containerd", - "Comment": "v0.32.0-1-g71f4d3db", - "Rev": "71f4d3dba95580556293597df2661f746e18481b" + "Comment": "v0.32.0-1-gc79add0e", + "Rev": "c79add0e72c545fe050a534aab35833c657c593e" }, { "ImportPath": "github.com/google/cadvisor/container/crio", - "Comment": "v0.32.0-1-g71f4d3db", - "Rev": "71f4d3dba95580556293597df2661f746e18481b" + "Comment": "v0.32.0-1-gc79add0e", + "Rev": "c79add0e72c545fe050a534aab35833c657c593e" }, { "ImportPath": "github.com/google/cadvisor/container/docker", - "Comment": "v0.32.0-1-g71f4d3db", - "Rev": "71f4d3dba95580556293597df2661f746e18481b" + "Comment": "v0.32.0-1-gc79add0e", + "Rev": "c79add0e72c545fe050a534aab35833c657c593e" }, { "ImportPath": "github.com/google/cadvisor/container/libcontainer", - "Comment": "v0.32.0-1-g71f4d3db", - "Rev": "71f4d3dba95580556293597df2661f746e18481b" + "Comment": "v0.32.0-1-gc79add0e", + "Rev": "c79add0e72c545fe050a534aab35833c657c593e" }, { "ImportPath": "github.com/google/cadvisor/container/mesos", - "Comment": "v0.32.0-1-g71f4d3db", - "Rev": "71f4d3dba95580556293597df2661f746e18481b" + "Comment": "v0.32.0-1-gc79add0e", + "Rev": "c79add0e72c545fe050a534aab35833c657c593e" }, { "ImportPath": "github.com/google/cadvisor/container/raw", - "Comment": "v0.32.0-1-g71f4d3db", - "Rev": "71f4d3dba95580556293597df2661f746e18481b" + "Comment": "v0.32.0-1-gc79add0e", + "Rev": "c79add0e72c545fe050a534aab35833c657c593e" }, { "ImportPath": "github.com/google/cadvisor/container/rkt", - "Comment": "v0.32.0-1-g71f4d3db", - "Rev": "71f4d3dba95580556293597df2661f746e18481b" + "Comment": "v0.32.0-1-gc79add0e", + "Rev": "c79add0e72c545fe050a534aab35833c657c593e" }, { "ImportPath": "github.com/google/cadvisor/container/systemd", - "Comment": "v0.32.0-1-g71f4d3db", - "Rev": "71f4d3dba95580556293597df2661f746e18481b" + "Comment": "v0.32.0-1-gc79add0e", + "Rev": "c79add0e72c545fe050a534aab35833c657c593e" }, { "ImportPath": "github.com/google/cadvisor/devicemapper", - "Comment": "v0.32.0-1-g71f4d3db", - "Rev": "71f4d3dba95580556293597df2661f746e18481b" + "Comment": "v0.32.0-1-gc79add0e", + "Rev": "c79add0e72c545fe050a534aab35833c657c593e" }, { "ImportPath": "github.com/google/cadvisor/events", - "Comment": "v0.32.0-1-g71f4d3db", - "Rev": "71f4d3dba95580556293597df2661f746e18481b" + "Comment": "v0.32.0-1-gc79add0e", + "Rev": "c79add0e72c545fe050a534aab35833c657c593e" }, { "ImportPath": "github.com/google/cadvisor/fs", - "Comment": "v0.32.0-1-g71f4d3db", - "Rev": "71f4d3dba95580556293597df2661f746e18481b" + "Comment": "v0.32.0-1-gc79add0e", + "Rev": "c79add0e72c545fe050a534aab35833c657c593e" }, { "ImportPath": "github.com/google/cadvisor/info/v1", - "Comment": "v0.32.0-1-g71f4d3db", - "Rev": "71f4d3dba95580556293597df2661f746e18481b" + "Comment": "v0.32.0-1-gc79add0e", + "Rev": "c79add0e72c545fe050a534aab35833c657c593e" }, { "ImportPath": "github.com/google/cadvisor/info/v2", - "Comment": "v0.32.0-1-g71f4d3db", - "Rev": "71f4d3dba95580556293597df2661f746e18481b" + "Comment": "v0.32.0-1-gc79add0e", + "Rev": "c79add0e72c545fe050a534aab35833c657c593e" }, { "ImportPath": "github.com/google/cadvisor/machine", - "Comment": "v0.32.0-1-g71f4d3db", - "Rev": "71f4d3dba95580556293597df2661f746e18481b" + "Comment": "v0.32.0-1-gc79add0e", + "Rev": "c79add0e72c545fe050a534aab35833c657c593e" }, { "ImportPath": "github.com/google/cadvisor/manager", - "Comment": "v0.32.0-1-g71f4d3db", - "Rev": "71f4d3dba95580556293597df2661f746e18481b" + "Comment": "v0.32.0-1-gc79add0e", + "Rev": "c79add0e72c545fe050a534aab35833c657c593e" }, { "ImportPath": "github.com/google/cadvisor/manager/watcher", - "Comment": "v0.32.0-1-g71f4d3db", - "Rev": "71f4d3dba95580556293597df2661f746e18481b" + "Comment": "v0.32.0-1-gc79add0e", + "Rev": "c79add0e72c545fe050a534aab35833c657c593e" }, { "ImportPath": "github.com/google/cadvisor/manager/watcher/raw", - "Comment": "v0.32.0-1-g71f4d3db", - "Rev": "71f4d3dba95580556293597df2661f746e18481b" + "Comment": "v0.32.0-1-gc79add0e", + "Rev": "c79add0e72c545fe050a534aab35833c657c593e" }, { "ImportPath": "github.com/google/cadvisor/manager/watcher/rkt", - "Comment": "v0.32.0-1-g71f4d3db", - "Rev": "71f4d3dba95580556293597df2661f746e18481b" + "Comment": "v0.32.0-1-gc79add0e", + "Rev": "c79add0e72c545fe050a534aab35833c657c593e" }, { "ImportPath": "github.com/google/cadvisor/metrics", - "Comment": "v0.32.0-1-g71f4d3db", - "Rev": "71f4d3dba95580556293597df2661f746e18481b" + "Comment": "v0.32.0-1-gc79add0e", + "Rev": "c79add0e72c545fe050a534aab35833c657c593e" }, { "ImportPath": "github.com/google/cadvisor/storage", - "Comment": "v0.32.0-1-g71f4d3db", - "Rev": "71f4d3dba95580556293597df2661f746e18481b" + "Comment": "v0.32.0-1-gc79add0e", + "Rev": "c79add0e72c545fe050a534aab35833c657c593e" }, { "ImportPath": "github.com/google/cadvisor/summary", - "Comment": "v0.32.0-1-g71f4d3db", - "Rev": "71f4d3dba95580556293597df2661f746e18481b" + "Comment": "v0.32.0-1-gc79add0e", + "Rev": "c79add0e72c545fe050a534aab35833c657c593e" }, { "ImportPath": "github.com/google/cadvisor/utils", - "Comment": "v0.32.0-1-g71f4d3db", - "Rev": "71f4d3dba95580556293597df2661f746e18481b" + "Comment": "v0.32.0-1-gc79add0e", + "Rev": "c79add0e72c545fe050a534aab35833c657c593e" }, { "ImportPath": "github.com/google/cadvisor/utils/cloudinfo", - "Comment": "v0.32.0-1-g71f4d3db", - "Rev": "71f4d3dba95580556293597df2661f746e18481b" + "Comment": "v0.32.0-1-gc79add0e", + "Rev": "c79add0e72c545fe050a534aab35833c657c593e" }, { "ImportPath": "github.com/google/cadvisor/utils/cpuload", - "Comment": "v0.32.0-1-g71f4d3db", - "Rev": "71f4d3dba95580556293597df2661f746e18481b" + "Comment": "v0.32.0-1-gc79add0e", + "Rev": "c79add0e72c545fe050a534aab35833c657c593e" }, { "ImportPath": "github.com/google/cadvisor/utils/cpuload/netlink", - "Comment": "v0.32.0-1-g71f4d3db", - "Rev": "71f4d3dba95580556293597df2661f746e18481b" + "Comment": "v0.32.0-1-gc79add0e", + "Rev": "c79add0e72c545fe050a534aab35833c657c593e" }, { "ImportPath": "github.com/google/cadvisor/utils/docker", - "Comment": "v0.32.0-1-g71f4d3db", - "Rev": "71f4d3dba95580556293597df2661f746e18481b" + "Comment": "v0.32.0-1-gc79add0e", + "Rev": "c79add0e72c545fe050a534aab35833c657c593e" }, { "ImportPath": "github.com/google/cadvisor/utils/oomparser", - "Comment": "v0.32.0-1-g71f4d3db", - "Rev": "71f4d3dba95580556293597df2661f746e18481b" + "Comment": "v0.32.0-1-gc79add0e", + "Rev": "c79add0e72c545fe050a534aab35833c657c593e" }, { "ImportPath": "github.com/google/cadvisor/utils/sysfs", - "Comment": "v0.32.0-1-g71f4d3db", - "Rev": "71f4d3dba95580556293597df2661f746e18481b" + "Comment": "v0.32.0-1-gc79add0e", + "Rev": "c79add0e72c545fe050a534aab35833c657c593e" }, { "ImportPath": "github.com/google/cadvisor/utils/sysinfo", - "Comment": "v0.32.0-1-g71f4d3db", - "Rev": "71f4d3dba95580556293597df2661f746e18481b" + "Comment": "v0.32.0-1-gc79add0e", + "Rev": "c79add0e72c545fe050a534aab35833c657c593e" }, { "ImportPath": "github.com/google/cadvisor/version", - "Comment": "v0.32.0-1-g71f4d3db", - "Rev": "71f4d3dba95580556293597df2661f746e18481b" + "Comment": "v0.32.0-1-gc79add0e", + "Rev": "c79add0e72c545fe050a534aab35833c657c593e" }, { "ImportPath": "github.com/google/cadvisor/zfs", - "Comment": "v0.32.0-1-g71f4d3db", - "Rev": "71f4d3dba95580556293597df2661f746e18481b" + "Comment": "v0.32.0-1-gc79add0e", + "Rev": "c79add0e72c545fe050a534aab35833c657c593e" }, { "ImportPath": "github.com/google/gofuzz", @@ -1159,17 +1168,17 @@ }, { "ImportPath": "github.com/heketi/heketi/client/api/go-client", - "Comment": "v8.0.0-49-g558b292", + "Comment": "v8.0.0-49-g558b2926", "Rev": "558b29266ce0a873991ecfb3edc41a668a998514" }, { "ImportPath": "github.com/heketi/heketi/pkg/glusterfs/api", - "Comment": "v8.0.0-49-g558b292", + "Comment": "v8.0.0-49-g558b2926", "Rev": "558b29266ce0a873991ecfb3edc41a668a998514" }, { "ImportPath": "github.com/heketi/heketi/pkg/utils", - "Comment": "v8.0.0-49-g558b292", + "Comment": "v8.0.0-49-g558b2926", "Rev": "558b29266ce0a873991ecfb3edc41a668a998514" }, { @@ -1207,31 +1216,31 @@ }, { "ImportPath": "github.com/libopenstorage/openstorage/api", - "Rev": "5a0aee411e4133f3def6a31563a4d216b66b0afe" + "Rev": "c888502d608ef472adb4d6752dd75ee654314d15" }, { "ImportPath": "github.com/libopenstorage/openstorage/api/client", - "Rev": "5a0aee411e4133f3def6a31563a4d216b66b0afe" + "Rev": "c888502d608ef472adb4d6752dd75ee654314d15" }, { "ImportPath": "github.com/libopenstorage/openstorage/api/client/volume", - "Rev": "5a0aee411e4133f3def6a31563a4d216b66b0afe" + "Rev": "c888502d608ef472adb4d6752dd75ee654314d15" }, { "ImportPath": "github.com/libopenstorage/openstorage/api/spec", - "Rev": "5a0aee411e4133f3def6a31563a4d216b66b0afe" + "Rev": "c888502d608ef472adb4d6752dd75ee654314d15" }, { "ImportPath": "github.com/libopenstorage/openstorage/pkg/parser", - "Rev": "5a0aee411e4133f3def6a31563a4d216b66b0afe" + "Rev": "c888502d608ef472adb4d6752dd75ee654314d15" }, { "ImportPath": "github.com/libopenstorage/openstorage/pkg/units", - "Rev": "5a0aee411e4133f3def6a31563a4d216b66b0afe" + "Rev": "c888502d608ef472adb4d6752dd75ee654314d15" }, { "ImportPath": "github.com/libopenstorage/openstorage/volume", - "Rev": "5a0aee411e4133f3def6a31563a4d216b66b0afe" + "Rev": "c888502d608ef472adb4d6752dd75ee654314d15" }, { "ImportPath": "github.com/mailru/easyjson/buffer", @@ -1262,73 +1271,73 @@ }, { "ImportPath": "github.com/mesos/mesos-go/api/v1/lib", - "Comment": "mesos-1.6.x-14-g55319d4", - "Rev": "55319d4ec884c3fb7ffdba6bbebe31a1bd869c03" + "Comment": "mesos-1.6.x-14-g7878dd5", + "Rev": "7878dd5d490f29f61aa313b25e0de108c893ca7e" }, { "ImportPath": "github.com/mesos/mesos-go/api/v1/lib/agent", - "Comment": "mesos-1.6.x-14-g55319d4", - "Rev": "55319d4ec884c3fb7ffdba6bbebe31a1bd869c03" + "Comment": "mesos-1.6.x-14-g7878dd5", + "Rev": "7878dd5d490f29f61aa313b25e0de108c893ca7e" }, { "ImportPath": "github.com/mesos/mesos-go/api/v1/lib/agent/calls", - "Comment": "mesos-1.6.x-14-g55319d4", - "Rev": "55319d4ec884c3fb7ffdba6bbebe31a1bd869c03" + "Comment": "mesos-1.6.x-14-g7878dd5", + "Rev": "7878dd5d490f29f61aa313b25e0de108c893ca7e" }, { "ImportPath": "github.com/mesos/mesos-go/api/v1/lib/client", - "Comment": "mesos-1.6.x-14-g55319d4", - "Rev": "55319d4ec884c3fb7ffdba6bbebe31a1bd869c03" + "Comment": "mesos-1.6.x-14-g7878dd5", + "Rev": "7878dd5d490f29f61aa313b25e0de108c893ca7e" }, { "ImportPath": "github.com/mesos/mesos-go/api/v1/lib/debug", - "Comment": "mesos-1.6.x-14-g55319d4", - "Rev": "55319d4ec884c3fb7ffdba6bbebe31a1bd869c03" + "Comment": "mesos-1.6.x-14-g7878dd5", + "Rev": "7878dd5d490f29f61aa313b25e0de108c893ca7e" }, { "ImportPath": "github.com/mesos/mesos-go/api/v1/lib/encoding", - "Comment": "mesos-1.6.x-14-g55319d4", - "Rev": "55319d4ec884c3fb7ffdba6bbebe31a1bd869c03" + "Comment": "mesos-1.6.x-14-g7878dd5", + "Rev": "7878dd5d490f29f61aa313b25e0de108c893ca7e" }, { "ImportPath": "github.com/mesos/mesos-go/api/v1/lib/encoding/codecs", - "Comment": "mesos-1.6.x-14-g55319d4", - "Rev": "55319d4ec884c3fb7ffdba6bbebe31a1bd869c03" + "Comment": "mesos-1.6.x-14-g7878dd5", + "Rev": "7878dd5d490f29f61aa313b25e0de108c893ca7e" }, { "ImportPath": "github.com/mesos/mesos-go/api/v1/lib/encoding/framing", - "Comment": "mesos-1.6.x-14-g55319d4", - "Rev": "55319d4ec884c3fb7ffdba6bbebe31a1bd869c03" + "Comment": "mesos-1.6.x-14-g7878dd5", + "Rev": "7878dd5d490f29f61aa313b25e0de108c893ca7e" }, { "ImportPath": "github.com/mesos/mesos-go/api/v1/lib/encoding/json", - "Comment": "mesos-1.6.x-14-g55319d4", - "Rev": "55319d4ec884c3fb7ffdba6bbebe31a1bd869c03" + "Comment": "mesos-1.6.x-14-g7878dd5", + "Rev": "7878dd5d490f29f61aa313b25e0de108c893ca7e" }, { "ImportPath": "github.com/mesos/mesos-go/api/v1/lib/encoding/proto", - "Comment": "mesos-1.6.x-14-g55319d4", - "Rev": "55319d4ec884c3fb7ffdba6bbebe31a1bd869c03" + "Comment": "mesos-1.6.x-14-g7878dd5", + "Rev": "7878dd5d490f29f61aa313b25e0de108c893ca7e" }, { "ImportPath": "github.com/mesos/mesos-go/api/v1/lib/httpcli", - "Comment": "mesos-1.6.x-14-g55319d4", - "Rev": "55319d4ec884c3fb7ffdba6bbebe31a1bd869c03" + "Comment": "mesos-1.6.x-14-g7878dd5", + "Rev": "7878dd5d490f29f61aa313b25e0de108c893ca7e" }, { "ImportPath": "github.com/mesos/mesos-go/api/v1/lib/httpcli/apierrors", - "Comment": "mesos-1.6.x-14-g55319d4", - "Rev": "55319d4ec884c3fb7ffdba6bbebe31a1bd869c03" + "Comment": "mesos-1.6.x-14-g7878dd5", + "Rev": "7878dd5d490f29f61aa313b25e0de108c893ca7e" }, { "ImportPath": "github.com/mesos/mesos-go/api/v1/lib/recordio", - "Comment": "mesos-1.6.x-14-g55319d4", - "Rev": "55319d4ec884c3fb7ffdba6bbebe31a1bd869c03" + "Comment": "mesos-1.6.x-14-g7878dd5", + "Rev": "7878dd5d490f29f61aa313b25e0de108c893ca7e" }, { "ImportPath": "github.com/mesos/mesos-go/api/v1/lib/roles", - "Comment": "mesos-1.6.x-14-g55319d4", - "Rev": "55319d4ec884c3fb7ffdba6bbebe31a1bd869c03" + "Comment": "mesos-1.6.x-14-g7878dd5", + "Rev": "7878dd5d490f29f61aa313b25e0de108c893ca7e" }, { "ImportPath": "github.com/miekg/dns", @@ -1385,83 +1394,83 @@ }, { "ImportPath": "github.com/opencontainers/runc/libcontainer", - "Comment": "v1.0.0-rc5-47-gea7170d5", - "Rev": "ea7170d59f0eda19113ddee10527bc5682b0be55" + "Comment": "v1.0.0-rc5-47-gc061e128", + "Rev": "c061e1283a72690919a3ccbc2c16e6cef9698569" }, { "ImportPath": "github.com/opencontainers/runc/libcontainer/apparmor", - "Comment": "v1.0.0-rc5-47-gea7170d5", - "Rev": "ea7170d59f0eda19113ddee10527bc5682b0be55" + "Comment": "v1.0.0-rc5-47-gc061e128", + "Rev": "c061e1283a72690919a3ccbc2c16e6cef9698569" }, { "ImportPath": "github.com/opencontainers/runc/libcontainer/cgroups", - "Comment": "v1.0.0-rc5-47-gea7170d5", - "Rev": "ea7170d59f0eda19113ddee10527bc5682b0be55" + "Comment": "v1.0.0-rc5-47-gc061e128", + "Rev": "c061e1283a72690919a3ccbc2c16e6cef9698569" }, { "ImportPath": "github.com/opencontainers/runc/libcontainer/cgroups/fs", - "Comment": "v1.0.0-rc5-47-gea7170d5", - "Rev": "ea7170d59f0eda19113ddee10527bc5682b0be55" + "Comment": "v1.0.0-rc5-47-gc061e128", + "Rev": "c061e1283a72690919a3ccbc2c16e6cef9698569" }, { "ImportPath": "github.com/opencontainers/runc/libcontainer/cgroups/systemd", - "Comment": "v1.0.0-rc5-47-gea7170d5", - "Rev": "ea7170d59f0eda19113ddee10527bc5682b0be55" + "Comment": "v1.0.0-rc5-47-gc061e128", + "Rev": "c061e1283a72690919a3ccbc2c16e6cef9698569" }, { "ImportPath": "github.com/opencontainers/runc/libcontainer/configs", - "Comment": "v1.0.0-rc5-47-gea7170d5", - "Rev": "ea7170d59f0eda19113ddee10527bc5682b0be55" + "Comment": "v1.0.0-rc5-47-gc061e128", + "Rev": "c061e1283a72690919a3ccbc2c16e6cef9698569" }, { "ImportPath": "github.com/opencontainers/runc/libcontainer/configs/validate", - "Comment": "v1.0.0-rc5-47-gea7170d5", - "Rev": "ea7170d59f0eda19113ddee10527bc5682b0be55" + "Comment": "v1.0.0-rc5-47-gc061e128", + "Rev": "c061e1283a72690919a3ccbc2c16e6cef9698569" }, { "ImportPath": "github.com/opencontainers/runc/libcontainer/criurpc", - "Comment": "v1.0.0-rc5-47-gea7170d5", - "Rev": "ea7170d59f0eda19113ddee10527bc5682b0be55" + "Comment": "v1.0.0-rc5-47-gc061e128", + "Rev": "c061e1283a72690919a3ccbc2c16e6cef9698569" }, { "ImportPath": "github.com/opencontainers/runc/libcontainer/intelrdt", - "Comment": "v1.0.0-rc5-47-gea7170d5", - "Rev": "ea7170d59f0eda19113ddee10527bc5682b0be55" + "Comment": "v1.0.0-rc5-47-gc061e128", + "Rev": "c061e1283a72690919a3ccbc2c16e6cef9698569" }, { "ImportPath": "github.com/opencontainers/runc/libcontainer/keys", - "Comment": "v1.0.0-rc5-47-gea7170d5", - "Rev": "ea7170d59f0eda19113ddee10527bc5682b0be55" + "Comment": "v1.0.0-rc5-47-gc061e128", + "Rev": "c061e1283a72690919a3ccbc2c16e6cef9698569" }, { "ImportPath": "github.com/opencontainers/runc/libcontainer/mount", - "Comment": "v1.0.0-rc5-47-gea7170d5", - "Rev": "ea7170d59f0eda19113ddee10527bc5682b0be55" + "Comment": "v1.0.0-rc5-47-gc061e128", + "Rev": "c061e1283a72690919a3ccbc2c16e6cef9698569" }, { "ImportPath": "github.com/opencontainers/runc/libcontainer/seccomp", - "Comment": "v1.0.0-rc5-47-gea7170d5", - "Rev": "ea7170d59f0eda19113ddee10527bc5682b0be55" + "Comment": "v1.0.0-rc5-47-gc061e128", + "Rev": "c061e1283a72690919a3ccbc2c16e6cef9698569" }, { "ImportPath": "github.com/opencontainers/runc/libcontainer/stacktrace", - "Comment": "v1.0.0-rc5-47-gea7170d5", - "Rev": "ea7170d59f0eda19113ddee10527bc5682b0be55" + "Comment": "v1.0.0-rc5-47-gc061e128", + "Rev": "c061e1283a72690919a3ccbc2c16e6cef9698569" }, { "ImportPath": "github.com/opencontainers/runc/libcontainer/system", - "Comment": "v1.0.0-rc5-47-gea7170d5", - "Rev": "ea7170d59f0eda19113ddee10527bc5682b0be55" + "Comment": "v1.0.0-rc5-47-gc061e128", + "Rev": "c061e1283a72690919a3ccbc2c16e6cef9698569" }, { "ImportPath": "github.com/opencontainers/runc/libcontainer/user", - "Comment": "v1.0.0-rc5-47-gea7170d5", - "Rev": "ea7170d59f0eda19113ddee10527bc5682b0be55" + "Comment": "v1.0.0-rc5-47-gc061e128", + "Rev": "c061e1283a72690919a3ccbc2c16e6cef9698569" }, { "ImportPath": "github.com/opencontainers/runc/libcontainer/utils", - "Comment": "v1.0.0-rc5-47-gea7170d5", - "Rev": "ea7170d59f0eda19113ddee10527bc5682b0be55" + "Comment": "v1.0.0-rc5-47-gc061e128", + "Rev": "c061e1283a72690919a3ccbc2c16e6cef9698569" }, { "ImportPath": "github.com/opencontainers/runtime-spec/specs-go", @@ -1502,11 +1511,11 @@ }, { "ImportPath": "github.com/pquerna/ffjson/fflib/v1", - "Rev": "9e2c6466d97bb185232b2534ed09356080100647" + "Rev": "7b31e31f7874d1661bf0f616e95c4b8e8600d9a9" }, { "ImportPath": "github.com/pquerna/ffjson/fflib/v1/internal", - "Rev": "9e2c6466d97bb185232b2534ed09356080100647" + "Rev": "7b31e31f7874d1661bf0f616e95c4b8e8600d9a9" }, { "ImportPath": "github.com/prometheus/client_golang/prometheus", @@ -1550,8 +1559,8 @@ }, { "ImportPath": "github.com/rancher/go-rancher/client", - "Comment": "v0.1.0-197-g83099ea", - "Rev": "83099eae75f167389dcf7372111ff2a1c5c43dfc" + "Comment": "v0.1.0-197-gc307816", + "Rev": "c3078161b04fe323c6c43d27ab893d6c7e8c5ec9" }, { "ImportPath": "github.com/renstrom/dedent", @@ -1560,7 +1569,7 @@ }, { "ImportPath": "github.com/rubiojr/go-vhd/vhd", - "Rev": "418c08ac24e1fde04a5dfa7f8b290514e4ae59a0" + "Rev": "7dd03acfebb96e022b222b564f6098c1337f712d" }, { "ImportPath": "github.com/satori/go.uuid", @@ -1628,13 +1637,13 @@ }, { "ImportPath": "github.com/stretchr/testify/assert", - "Comment": "v1.2.1-15-g8e0656f", - "Rev": "8e0656fdf766ca9523f21349d30ce89ddd12ed94" + "Comment": "v1.2.1-15-gecb9b00", + "Rev": "ecb9b00c820a813dc8968fbaaed8a838fb241a27" }, { "ImportPath": "github.com/stretchr/testify/mock", - "Comment": "v1.2.1-15-g8e0656f", - "Rev": "8e0656fdf766ca9523f21349d30ce89ddd12ed94" + "Comment": "v1.2.1-15-gecb9b00", + "Rev": "ecb9b00c820a813dc8968fbaaed8a838fb241a27" }, { "ImportPath": "github.com/syndtr/gocapability/capability", @@ -1654,133 +1663,133 @@ }, { "ImportPath": "github.com/vmware/govmomi/find", - "Comment": "v0.18.0-50-g85b21fd", - "Rev": "85b21fd1adeb776b697965951a9f35f07cd52e37" + "Comment": "v0.18.0-50-g9acdfc2", + "Rev": "9acdfc28401d087b96a15e5ae27b53a4842977b0" }, { "ImportPath": "github.com/vmware/govmomi/list", - "Comment": "v0.18.0-50-g85b21fd", - "Rev": "85b21fd1adeb776b697965951a9f35f07cd52e37" + "Comment": "v0.18.0-50-g9acdfc2", + "Rev": "9acdfc28401d087b96a15e5ae27b53a4842977b0" }, { "ImportPath": "github.com/vmware/govmomi/lookup", - "Comment": "v0.18.0-50-g85b21fd", - "Rev": "85b21fd1adeb776b697965951a9f35f07cd52e37" + "Comment": "v0.18.0-50-g9acdfc2", + "Rev": "9acdfc28401d087b96a15e5ae27b53a4842977b0" }, { "ImportPath": "github.com/vmware/govmomi/lookup/methods", - "Comment": "v0.18.0-50-g85b21fd", - "Rev": "85b21fd1adeb776b697965951a9f35f07cd52e37" + "Comment": "v0.18.0-50-g9acdfc2", + "Rev": "9acdfc28401d087b96a15e5ae27b53a4842977b0" }, { "ImportPath": "github.com/vmware/govmomi/lookup/types", - "Comment": "v0.18.0-50-g85b21fd", - "Rev": "85b21fd1adeb776b697965951a9f35f07cd52e37" + "Comment": "v0.18.0-50-g9acdfc2", + "Rev": "9acdfc28401d087b96a15e5ae27b53a4842977b0" }, { "ImportPath": "github.com/vmware/govmomi/nfc", - "Comment": "v0.18.0-50-g85b21fd", - "Rev": "85b21fd1adeb776b697965951a9f35f07cd52e37" + "Comment": "v0.18.0-50-g9acdfc2", + "Rev": "9acdfc28401d087b96a15e5ae27b53a4842977b0" }, { "ImportPath": "github.com/vmware/govmomi/object", - "Comment": "v0.18.0-50-g85b21fd", - "Rev": "85b21fd1adeb776b697965951a9f35f07cd52e37" + "Comment": "v0.18.0-50-g9acdfc2", + "Rev": "9acdfc28401d087b96a15e5ae27b53a4842977b0" }, { "ImportPath": "github.com/vmware/govmomi/pbm", - "Comment": "v0.18.0-50-g85b21fd", - "Rev": "85b21fd1adeb776b697965951a9f35f07cd52e37" + "Comment": "v0.18.0-50-g9acdfc2", + "Rev": "9acdfc28401d087b96a15e5ae27b53a4842977b0" }, { "ImportPath": "github.com/vmware/govmomi/pbm/methods", - "Comment": "v0.18.0-50-g85b21fd", - "Rev": "85b21fd1adeb776b697965951a9f35f07cd52e37" + "Comment": "v0.18.0-50-g9acdfc2", + "Rev": "9acdfc28401d087b96a15e5ae27b53a4842977b0" }, { "ImportPath": "github.com/vmware/govmomi/pbm/types", - "Comment": "v0.18.0-50-g85b21fd", - "Rev": "85b21fd1adeb776b697965951a9f35f07cd52e37" + "Comment": "v0.18.0-50-g9acdfc2", + "Rev": "9acdfc28401d087b96a15e5ae27b53a4842977b0" }, { "ImportPath": "github.com/vmware/govmomi/property", - "Comment": "v0.18.0-50-g85b21fd", - "Rev": "85b21fd1adeb776b697965951a9f35f07cd52e37" + "Comment": "v0.18.0-50-g9acdfc2", + "Rev": "9acdfc28401d087b96a15e5ae27b53a4842977b0" }, { "ImportPath": "github.com/vmware/govmomi/session", - "Comment": "v0.18.0-50-g85b21fd", - "Rev": "85b21fd1adeb776b697965951a9f35f07cd52e37" + "Comment": "v0.18.0-50-g9acdfc2", + "Rev": "9acdfc28401d087b96a15e5ae27b53a4842977b0" }, { "ImportPath": "github.com/vmware/govmomi/sts", - "Comment": "v0.18.0-50-g85b21fd", - "Rev": "85b21fd1adeb776b697965951a9f35f07cd52e37" + "Comment": "v0.18.0-50-g9acdfc2", + "Rev": "9acdfc28401d087b96a15e5ae27b53a4842977b0" }, { "ImportPath": "github.com/vmware/govmomi/sts/internal", - "Comment": "v0.18.0-50-g85b21fd", - "Rev": "85b21fd1adeb776b697965951a9f35f07cd52e37" + "Comment": "v0.18.0-50-g9acdfc2", + "Rev": "9acdfc28401d087b96a15e5ae27b53a4842977b0" }, { "ImportPath": "github.com/vmware/govmomi/task", - "Comment": "v0.18.0-50-g85b21fd", - "Rev": "85b21fd1adeb776b697965951a9f35f07cd52e37" + "Comment": "v0.18.0-50-g9acdfc2", + "Rev": "9acdfc28401d087b96a15e5ae27b53a4842977b0" }, { "ImportPath": "github.com/vmware/govmomi/vapi/internal", - "Comment": "v0.18.0-50-g85b21fd", - "Rev": "85b21fd1adeb776b697965951a9f35f07cd52e37" + "Comment": "v0.18.0-50-g9acdfc2", + "Rev": "9acdfc28401d087b96a15e5ae27b53a4842977b0" }, { "ImportPath": "github.com/vmware/govmomi/vapi/rest", - "Comment": "v0.18.0-50-g85b21fd", - "Rev": "85b21fd1adeb776b697965951a9f35f07cd52e37" + "Comment": "v0.18.0-50-g9acdfc2", + "Rev": "9acdfc28401d087b96a15e5ae27b53a4842977b0" }, { "ImportPath": "github.com/vmware/govmomi/vapi/tags", - "Comment": "v0.18.0-50-g85b21fd", - "Rev": "85b21fd1adeb776b697965951a9f35f07cd52e37" + "Comment": "v0.18.0-50-g9acdfc2", + "Rev": "9acdfc28401d087b96a15e5ae27b53a4842977b0" }, { "ImportPath": "github.com/vmware/govmomi/vim25", - "Comment": "v0.18.0-50-g85b21fd", - "Rev": "85b21fd1adeb776b697965951a9f35f07cd52e37" + "Comment": "v0.18.0-50-g9acdfc2", + "Rev": "9acdfc28401d087b96a15e5ae27b53a4842977b0" }, { "ImportPath": "github.com/vmware/govmomi/vim25/debug", - "Comment": "v0.18.0-50-g85b21fd", - "Rev": "85b21fd1adeb776b697965951a9f35f07cd52e37" + "Comment": "v0.18.0-50-g9acdfc2", + "Rev": "9acdfc28401d087b96a15e5ae27b53a4842977b0" }, { "ImportPath": "github.com/vmware/govmomi/vim25/methods", - "Comment": "v0.18.0-50-g85b21fd", - "Rev": "85b21fd1adeb776b697965951a9f35f07cd52e37" + "Comment": "v0.18.0-50-g9acdfc2", + "Rev": "9acdfc28401d087b96a15e5ae27b53a4842977b0" }, { "ImportPath": "github.com/vmware/govmomi/vim25/mo", - "Comment": "v0.18.0-50-g85b21fd", - "Rev": "85b21fd1adeb776b697965951a9f35f07cd52e37" + "Comment": "v0.18.0-50-g9acdfc2", + "Rev": "9acdfc28401d087b96a15e5ae27b53a4842977b0" }, { "ImportPath": "github.com/vmware/govmomi/vim25/progress", - "Comment": "v0.18.0-50-g85b21fd", - "Rev": "85b21fd1adeb776b697965951a9f35f07cd52e37" + "Comment": "v0.18.0-50-g9acdfc2", + "Rev": "9acdfc28401d087b96a15e5ae27b53a4842977b0" }, { "ImportPath": "github.com/vmware/govmomi/vim25/soap", - "Comment": "v0.18.0-50-g85b21fd", - "Rev": "85b21fd1adeb776b697965951a9f35f07cd52e37" + "Comment": "v0.18.0-50-g9acdfc2", + "Rev": "9acdfc28401d087b96a15e5ae27b53a4842977b0" }, { "ImportPath": "github.com/vmware/govmomi/vim25/types", - "Comment": "v0.18.0-50-g85b21fd", - "Rev": "85b21fd1adeb776b697965951a9f35f07cd52e37" + "Comment": "v0.18.0-50-g9acdfc2", + "Rev": "9acdfc28401d087b96a15e5ae27b53a4842977b0" }, { "ImportPath": "github.com/vmware/govmomi/vim25/xml", - "Comment": "v0.18.0-50-g85b21fd", - "Rev": "85b21fd1adeb776b697965951a9f35f07cd52e37" + "Comment": "v0.18.0-50-g9acdfc2", + "Rev": "9acdfc28401d087b96a15e5ae27b53a4842977b0" }, { "ImportPath": "github.com/vmware/photon-controller-go-sdk/SSPI", @@ -1996,39 +2005,39 @@ }, { "ImportPath": "google.golang.org/api/compute/v0.alpha", - "Rev": "9ae993de6357beab523761e324a2e0941b323833" + "Rev": "48d7507584184935318f7e63262c8dd702782db8" }, { "ImportPath": "google.golang.org/api/compute/v0.beta", - "Rev": "9ae993de6357beab523761e324a2e0941b323833" + "Rev": "48d7507584184935318f7e63262c8dd702782db8" }, { "ImportPath": "google.golang.org/api/compute/v1", - "Rev": "9ae993de6357beab523761e324a2e0941b323833" + "Rev": "48d7507584184935318f7e63262c8dd702782db8" }, { "ImportPath": "google.golang.org/api/container/v1", - "Rev": "9ae993de6357beab523761e324a2e0941b323833" + "Rev": "48d7507584184935318f7e63262c8dd702782db8" }, { "ImportPath": "google.golang.org/api/container/v1beta1", - "Rev": "9ae993de6357beab523761e324a2e0941b323833" + "Rev": "48d7507584184935318f7e63262c8dd702782db8" }, { "ImportPath": "google.golang.org/api/gensupport", - "Rev": "9ae993de6357beab523761e324a2e0941b323833" + "Rev": "48d7507584184935318f7e63262c8dd702782db8" }, { "ImportPath": "google.golang.org/api/googleapi", - "Rev": "9ae993de6357beab523761e324a2e0941b323833" + "Rev": "48d7507584184935318f7e63262c8dd702782db8" }, { "ImportPath": "google.golang.org/api/googleapi/internal/uritemplates", - "Rev": "9ae993de6357beab523761e324a2e0941b323833" + "Rev": "48d7507584184935318f7e63262c8dd702782db8" }, { "ImportPath": "google.golang.org/api/tpu/v1", - "Rev": "9ae993de6357beab523761e324a2e0941b323833" + "Rev": "48d7507584184935318f7e63262c8dd702782db8" }, { "ImportPath": "google.golang.org/genproto/googleapis/rpc/status", @@ -2216,1379 +2225,1379 @@ }, { "ImportPath": "k8s.io/api/admission/v1beta1", - "Rev": "e22207415b9969dd281d66b837d2ac921d6c1b86" + "Rev": "d6bc0b913e9c7a07c059b15213aa9cc9bf225aae" }, { "ImportPath": "k8s.io/api/admissionregistration/v1alpha1", - "Rev": "e22207415b9969dd281d66b837d2ac921d6c1b86" + "Rev": "d6bc0b913e9c7a07c059b15213aa9cc9bf225aae" }, { "ImportPath": "k8s.io/api/admissionregistration/v1beta1", - "Rev": "e22207415b9969dd281d66b837d2ac921d6c1b86" + "Rev": "d6bc0b913e9c7a07c059b15213aa9cc9bf225aae" }, { "ImportPath": "k8s.io/api/apps/v1", - "Rev": "e22207415b9969dd281d66b837d2ac921d6c1b86" + "Rev": "d6bc0b913e9c7a07c059b15213aa9cc9bf225aae" }, { "ImportPath": "k8s.io/api/apps/v1beta1", - "Rev": "e22207415b9969dd281d66b837d2ac921d6c1b86" + "Rev": "d6bc0b913e9c7a07c059b15213aa9cc9bf225aae" }, { "ImportPath": "k8s.io/api/apps/v1beta2", - "Rev": "e22207415b9969dd281d66b837d2ac921d6c1b86" + "Rev": "d6bc0b913e9c7a07c059b15213aa9cc9bf225aae" }, { "ImportPath": "k8s.io/api/auditregistration/v1alpha1", - "Rev": "e22207415b9969dd281d66b837d2ac921d6c1b86" + "Rev": "d6bc0b913e9c7a07c059b15213aa9cc9bf225aae" }, { "ImportPath": "k8s.io/api/authentication/v1", - "Rev": "e22207415b9969dd281d66b837d2ac921d6c1b86" + "Rev": "d6bc0b913e9c7a07c059b15213aa9cc9bf225aae" }, { "ImportPath": "k8s.io/api/authentication/v1beta1", - "Rev": "e22207415b9969dd281d66b837d2ac921d6c1b86" + "Rev": "d6bc0b913e9c7a07c059b15213aa9cc9bf225aae" }, { "ImportPath": "k8s.io/api/authorization/v1", - "Rev": "e22207415b9969dd281d66b837d2ac921d6c1b86" + "Rev": "d6bc0b913e9c7a07c059b15213aa9cc9bf225aae" }, { "ImportPath": "k8s.io/api/authorization/v1beta1", - "Rev": "e22207415b9969dd281d66b837d2ac921d6c1b86" + "Rev": "d6bc0b913e9c7a07c059b15213aa9cc9bf225aae" }, { "ImportPath": "k8s.io/api/autoscaling/v1", - "Rev": "e22207415b9969dd281d66b837d2ac921d6c1b86" + "Rev": "d6bc0b913e9c7a07c059b15213aa9cc9bf225aae" }, { "ImportPath": "k8s.io/api/autoscaling/v2beta1", - "Rev": "e22207415b9969dd281d66b837d2ac921d6c1b86" + "Rev": "d6bc0b913e9c7a07c059b15213aa9cc9bf225aae" }, { "ImportPath": "k8s.io/api/autoscaling/v2beta2", - "Rev": "e22207415b9969dd281d66b837d2ac921d6c1b86" + "Rev": "d6bc0b913e9c7a07c059b15213aa9cc9bf225aae" }, { "ImportPath": "k8s.io/api/batch/v1", - "Rev": "e22207415b9969dd281d66b837d2ac921d6c1b86" + "Rev": "d6bc0b913e9c7a07c059b15213aa9cc9bf225aae" }, { "ImportPath": "k8s.io/api/batch/v1beta1", - "Rev": "e22207415b9969dd281d66b837d2ac921d6c1b86" + "Rev": "d6bc0b913e9c7a07c059b15213aa9cc9bf225aae" }, { "ImportPath": "k8s.io/api/batch/v2alpha1", - "Rev": "e22207415b9969dd281d66b837d2ac921d6c1b86" + "Rev": "d6bc0b913e9c7a07c059b15213aa9cc9bf225aae" }, { "ImportPath": "k8s.io/api/certificates/v1beta1", - "Rev": "e22207415b9969dd281d66b837d2ac921d6c1b86" + "Rev": "d6bc0b913e9c7a07c059b15213aa9cc9bf225aae" }, { "ImportPath": "k8s.io/api/coordination/v1beta1", - "Rev": "e22207415b9969dd281d66b837d2ac921d6c1b86" + "Rev": "d6bc0b913e9c7a07c059b15213aa9cc9bf225aae" }, { "ImportPath": "k8s.io/api/core/v1", - "Rev": "e22207415b9969dd281d66b837d2ac921d6c1b86" + "Rev": "d6bc0b913e9c7a07c059b15213aa9cc9bf225aae" }, { "ImportPath": "k8s.io/api/events/v1beta1", - "Rev": "e22207415b9969dd281d66b837d2ac921d6c1b86" + "Rev": "d6bc0b913e9c7a07c059b15213aa9cc9bf225aae" }, { "ImportPath": "k8s.io/api/extensions/v1beta1", - "Rev": "e22207415b9969dd281d66b837d2ac921d6c1b86" + "Rev": "d6bc0b913e9c7a07c059b15213aa9cc9bf225aae" }, { "ImportPath": "k8s.io/api/imagepolicy/v1alpha1", - "Rev": "e22207415b9969dd281d66b837d2ac921d6c1b86" + "Rev": "d6bc0b913e9c7a07c059b15213aa9cc9bf225aae" }, { "ImportPath": "k8s.io/api/networking/v1", - "Rev": "e22207415b9969dd281d66b837d2ac921d6c1b86" + "Rev": "d6bc0b913e9c7a07c059b15213aa9cc9bf225aae" }, { "ImportPath": "k8s.io/api/policy/v1beta1", - "Rev": "e22207415b9969dd281d66b837d2ac921d6c1b86" + "Rev": "d6bc0b913e9c7a07c059b15213aa9cc9bf225aae" }, { "ImportPath": "k8s.io/api/rbac/v1", - "Rev": "e22207415b9969dd281d66b837d2ac921d6c1b86" + "Rev": "d6bc0b913e9c7a07c059b15213aa9cc9bf225aae" }, { "ImportPath": "k8s.io/api/rbac/v1alpha1", - "Rev": "e22207415b9969dd281d66b837d2ac921d6c1b86" + "Rev": "d6bc0b913e9c7a07c059b15213aa9cc9bf225aae" }, { "ImportPath": "k8s.io/api/rbac/v1beta1", - "Rev": "e22207415b9969dd281d66b837d2ac921d6c1b86" + "Rev": "d6bc0b913e9c7a07c059b15213aa9cc9bf225aae" }, { "ImportPath": "k8s.io/api/scheduling/v1alpha1", - "Rev": "e22207415b9969dd281d66b837d2ac921d6c1b86" + "Rev": "d6bc0b913e9c7a07c059b15213aa9cc9bf225aae" }, { "ImportPath": "k8s.io/api/scheduling/v1beta1", - "Rev": "e22207415b9969dd281d66b837d2ac921d6c1b86" + "Rev": "d6bc0b913e9c7a07c059b15213aa9cc9bf225aae" }, { "ImportPath": "k8s.io/api/settings/v1alpha1", - "Rev": "e22207415b9969dd281d66b837d2ac921d6c1b86" + "Rev": "d6bc0b913e9c7a07c059b15213aa9cc9bf225aae" }, { "ImportPath": "k8s.io/api/storage/v1", - "Rev": "e22207415b9969dd281d66b837d2ac921d6c1b86" + "Rev": "d6bc0b913e9c7a07c059b15213aa9cc9bf225aae" }, { "ImportPath": "k8s.io/api/storage/v1alpha1", - "Rev": "e22207415b9969dd281d66b837d2ac921d6c1b86" + "Rev": "d6bc0b913e9c7a07c059b15213aa9cc9bf225aae" }, { "ImportPath": "k8s.io/api/storage/v1beta1", - "Rev": "e22207415b9969dd281d66b837d2ac921d6c1b86" + "Rev": "d6bc0b913e9c7a07c059b15213aa9cc9bf225aae" }, { "ImportPath": "k8s.io/apiextensions-apiserver/pkg/features", - "Rev": "6a7a980c2fdf70626551c2391d6ee253eb33e830" + "Rev": "65ed30d16d6dcb505d463ceeedb0f4ea2bb3860c" }, { "ImportPath": "k8s.io/apimachinery/pkg/api/equality", - "Rev": "48046c6f120068248d1e115f4f9554d1bac539be" + "Rev": "2c348e07047b379e27a535228ee4fc30c3494a4b" }, { "ImportPath": "k8s.io/apimachinery/pkg/api/errors", - "Rev": "48046c6f120068248d1e115f4f9554d1bac539be" + "Rev": "2c348e07047b379e27a535228ee4fc30c3494a4b" }, { "ImportPath": "k8s.io/apimachinery/pkg/api/meta", - "Rev": "48046c6f120068248d1e115f4f9554d1bac539be" + "Rev": "2c348e07047b379e27a535228ee4fc30c3494a4b" }, { "ImportPath": "k8s.io/apimachinery/pkg/api/resource", - "Rev": "48046c6f120068248d1e115f4f9554d1bac539be" + "Rev": "2c348e07047b379e27a535228ee4fc30c3494a4b" }, { "ImportPath": "k8s.io/apimachinery/pkg/api/validation", - "Rev": "48046c6f120068248d1e115f4f9554d1bac539be" + "Rev": "2c348e07047b379e27a535228ee4fc30c3494a4b" }, { "ImportPath": "k8s.io/apimachinery/pkg/api/validation/path", - "Rev": "48046c6f120068248d1e115f4f9554d1bac539be" + "Rev": "2c348e07047b379e27a535228ee4fc30c3494a4b" }, { "ImportPath": "k8s.io/apimachinery/pkg/apis/config", - "Rev": "48046c6f120068248d1e115f4f9554d1bac539be" + "Rev": "2c348e07047b379e27a535228ee4fc30c3494a4b" }, { "ImportPath": "k8s.io/apimachinery/pkg/apis/config/v1alpha1", - "Rev": "48046c6f120068248d1e115f4f9554d1bac539be" + "Rev": "2c348e07047b379e27a535228ee4fc30c3494a4b" }, { "ImportPath": "k8s.io/apimachinery/pkg/apis/meta/internalversion", - "Rev": "48046c6f120068248d1e115f4f9554d1bac539be" + "Rev": "2c348e07047b379e27a535228ee4fc30c3494a4b" }, { "ImportPath": "k8s.io/apimachinery/pkg/apis/meta/v1", - "Rev": "48046c6f120068248d1e115f4f9554d1bac539be" + "Rev": "2c348e07047b379e27a535228ee4fc30c3494a4b" }, { "ImportPath": "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured", - "Rev": "48046c6f120068248d1e115f4f9554d1bac539be" + "Rev": "2c348e07047b379e27a535228ee4fc30c3494a4b" }, { "ImportPath": "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured/unstructuredscheme", - "Rev": "48046c6f120068248d1e115f4f9554d1bac539be" + "Rev": "2c348e07047b379e27a535228ee4fc30c3494a4b" }, { "ImportPath": "k8s.io/apimachinery/pkg/apis/meta/v1/validation", - "Rev": "48046c6f120068248d1e115f4f9554d1bac539be" + "Rev": "2c348e07047b379e27a535228ee4fc30c3494a4b" }, { "ImportPath": "k8s.io/apimachinery/pkg/apis/meta/v1beta1", - "Rev": "48046c6f120068248d1e115f4f9554d1bac539be" + "Rev": "2c348e07047b379e27a535228ee4fc30c3494a4b" }, { "ImportPath": "k8s.io/apimachinery/pkg/conversion", - "Rev": "48046c6f120068248d1e115f4f9554d1bac539be" + "Rev": "2c348e07047b379e27a535228ee4fc30c3494a4b" }, { "ImportPath": "k8s.io/apimachinery/pkg/conversion/queryparams", - "Rev": "48046c6f120068248d1e115f4f9554d1bac539be" + "Rev": "2c348e07047b379e27a535228ee4fc30c3494a4b" }, { "ImportPath": "k8s.io/apimachinery/pkg/fields", - "Rev": "48046c6f120068248d1e115f4f9554d1bac539be" + "Rev": "2c348e07047b379e27a535228ee4fc30c3494a4b" }, { "ImportPath": "k8s.io/apimachinery/pkg/labels", - "Rev": "48046c6f120068248d1e115f4f9554d1bac539be" + "Rev": "2c348e07047b379e27a535228ee4fc30c3494a4b" }, { "ImportPath": "k8s.io/apimachinery/pkg/runtime", - "Rev": "48046c6f120068248d1e115f4f9554d1bac539be" + "Rev": "2c348e07047b379e27a535228ee4fc30c3494a4b" }, { "ImportPath": "k8s.io/apimachinery/pkg/runtime/schema", - "Rev": "48046c6f120068248d1e115f4f9554d1bac539be" + "Rev": "2c348e07047b379e27a535228ee4fc30c3494a4b" }, { "ImportPath": "k8s.io/apimachinery/pkg/runtime/serializer", - "Rev": "48046c6f120068248d1e115f4f9554d1bac539be" + "Rev": "2c348e07047b379e27a535228ee4fc30c3494a4b" }, { "ImportPath": "k8s.io/apimachinery/pkg/runtime/serializer/json", - "Rev": "48046c6f120068248d1e115f4f9554d1bac539be" + "Rev": "2c348e07047b379e27a535228ee4fc30c3494a4b" }, { "ImportPath": "k8s.io/apimachinery/pkg/runtime/serializer/protobuf", - "Rev": "48046c6f120068248d1e115f4f9554d1bac539be" + "Rev": "2c348e07047b379e27a535228ee4fc30c3494a4b" }, { "ImportPath": "k8s.io/apimachinery/pkg/runtime/serializer/recognizer", - "Rev": "48046c6f120068248d1e115f4f9554d1bac539be" + "Rev": "2c348e07047b379e27a535228ee4fc30c3494a4b" }, { "ImportPath": "k8s.io/apimachinery/pkg/runtime/serializer/streaming", - "Rev": "48046c6f120068248d1e115f4f9554d1bac539be" + "Rev": "2c348e07047b379e27a535228ee4fc30c3494a4b" }, { "ImportPath": "k8s.io/apimachinery/pkg/runtime/serializer/versioning", - "Rev": "48046c6f120068248d1e115f4f9554d1bac539be" + "Rev": "2c348e07047b379e27a535228ee4fc30c3494a4b" }, { "ImportPath": "k8s.io/apimachinery/pkg/selection", - "Rev": "48046c6f120068248d1e115f4f9554d1bac539be" + "Rev": "2c348e07047b379e27a535228ee4fc30c3494a4b" }, { "ImportPath": "k8s.io/apimachinery/pkg/types", - "Rev": "48046c6f120068248d1e115f4f9554d1bac539be" + "Rev": "2c348e07047b379e27a535228ee4fc30c3494a4b" }, { "ImportPath": "k8s.io/apimachinery/pkg/util/cache", - "Rev": "48046c6f120068248d1e115f4f9554d1bac539be" + "Rev": "2c348e07047b379e27a535228ee4fc30c3494a4b" }, { "ImportPath": "k8s.io/apimachinery/pkg/util/clock", - "Rev": "48046c6f120068248d1e115f4f9554d1bac539be" + "Rev": "2c348e07047b379e27a535228ee4fc30c3494a4b" }, { "ImportPath": "k8s.io/apimachinery/pkg/util/diff", - "Rev": "48046c6f120068248d1e115f4f9554d1bac539be" + "Rev": "2c348e07047b379e27a535228ee4fc30c3494a4b" }, { "ImportPath": "k8s.io/apimachinery/pkg/util/duration", - "Rev": "48046c6f120068248d1e115f4f9554d1bac539be" + "Rev": "2c348e07047b379e27a535228ee4fc30c3494a4b" }, { "ImportPath": "k8s.io/apimachinery/pkg/util/errors", - "Rev": "48046c6f120068248d1e115f4f9554d1bac539be" + "Rev": "2c348e07047b379e27a535228ee4fc30c3494a4b" }, { "ImportPath": "k8s.io/apimachinery/pkg/util/framer", - "Rev": "48046c6f120068248d1e115f4f9554d1bac539be" + "Rev": "2c348e07047b379e27a535228ee4fc30c3494a4b" }, { "ImportPath": "k8s.io/apimachinery/pkg/util/httpstream", - "Rev": "48046c6f120068248d1e115f4f9554d1bac539be" + "Rev": "2c348e07047b379e27a535228ee4fc30c3494a4b" }, { "ImportPath": "k8s.io/apimachinery/pkg/util/httpstream/spdy", - "Rev": "48046c6f120068248d1e115f4f9554d1bac539be" + "Rev": "2c348e07047b379e27a535228ee4fc30c3494a4b" }, { "ImportPath": "k8s.io/apimachinery/pkg/util/intstr", - "Rev": "48046c6f120068248d1e115f4f9554d1bac539be" + "Rev": "2c348e07047b379e27a535228ee4fc30c3494a4b" }, { "ImportPath": "k8s.io/apimachinery/pkg/util/json", - "Rev": "48046c6f120068248d1e115f4f9554d1bac539be" + "Rev": "2c348e07047b379e27a535228ee4fc30c3494a4b" }, { "ImportPath": "k8s.io/apimachinery/pkg/util/mergepatch", - "Rev": "48046c6f120068248d1e115f4f9554d1bac539be" + "Rev": "2c348e07047b379e27a535228ee4fc30c3494a4b" }, { "ImportPath": "k8s.io/apimachinery/pkg/util/naming", - "Rev": "48046c6f120068248d1e115f4f9554d1bac539be" + "Rev": "2c348e07047b379e27a535228ee4fc30c3494a4b" }, { "ImportPath": "k8s.io/apimachinery/pkg/util/net", - "Rev": "48046c6f120068248d1e115f4f9554d1bac539be" + "Rev": "2c348e07047b379e27a535228ee4fc30c3494a4b" }, { "ImportPath": "k8s.io/apimachinery/pkg/util/proxy", - "Rev": "48046c6f120068248d1e115f4f9554d1bac539be" + "Rev": "2c348e07047b379e27a535228ee4fc30c3494a4b" }, { "ImportPath": "k8s.io/apimachinery/pkg/util/rand", - "Rev": "48046c6f120068248d1e115f4f9554d1bac539be" + "Rev": "2c348e07047b379e27a535228ee4fc30c3494a4b" }, { "ImportPath": "k8s.io/apimachinery/pkg/util/remotecommand", - "Rev": "48046c6f120068248d1e115f4f9554d1bac539be" + "Rev": "2c348e07047b379e27a535228ee4fc30c3494a4b" }, { "ImportPath": "k8s.io/apimachinery/pkg/util/runtime", - "Rev": "48046c6f120068248d1e115f4f9554d1bac539be" + "Rev": "2c348e07047b379e27a535228ee4fc30c3494a4b" }, { "ImportPath": "k8s.io/apimachinery/pkg/util/sets", - "Rev": "48046c6f120068248d1e115f4f9554d1bac539be" + "Rev": "2c348e07047b379e27a535228ee4fc30c3494a4b" }, { "ImportPath": "k8s.io/apimachinery/pkg/util/strategicpatch", - "Rev": "48046c6f120068248d1e115f4f9554d1bac539be" + "Rev": "2c348e07047b379e27a535228ee4fc30c3494a4b" }, { "ImportPath": "k8s.io/apimachinery/pkg/util/uuid", - "Rev": "48046c6f120068248d1e115f4f9554d1bac539be" + "Rev": "2c348e07047b379e27a535228ee4fc30c3494a4b" }, { "ImportPath": "k8s.io/apimachinery/pkg/util/validation", - "Rev": "48046c6f120068248d1e115f4f9554d1bac539be" + "Rev": "2c348e07047b379e27a535228ee4fc30c3494a4b" }, { "ImportPath": "k8s.io/apimachinery/pkg/util/validation/field", - "Rev": "48046c6f120068248d1e115f4f9554d1bac539be" + "Rev": "2c348e07047b379e27a535228ee4fc30c3494a4b" }, { "ImportPath": "k8s.io/apimachinery/pkg/util/version", - "Rev": "48046c6f120068248d1e115f4f9554d1bac539be" + "Rev": "2c348e07047b379e27a535228ee4fc30c3494a4b" }, { "ImportPath": "k8s.io/apimachinery/pkg/util/wait", - "Rev": "48046c6f120068248d1e115f4f9554d1bac539be" + "Rev": "2c348e07047b379e27a535228ee4fc30c3494a4b" }, { "ImportPath": "k8s.io/apimachinery/pkg/util/yaml", - "Rev": "48046c6f120068248d1e115f4f9554d1bac539be" + "Rev": "2c348e07047b379e27a535228ee4fc30c3494a4b" }, { "ImportPath": "k8s.io/apimachinery/pkg/version", - "Rev": "48046c6f120068248d1e115f4f9554d1bac539be" + "Rev": "2c348e07047b379e27a535228ee4fc30c3494a4b" }, { "ImportPath": "k8s.io/apimachinery/pkg/watch", - "Rev": "48046c6f120068248d1e115f4f9554d1bac539be" + "Rev": "2c348e07047b379e27a535228ee4fc30c3494a4b" }, { "ImportPath": "k8s.io/apimachinery/third_party/forked/golang/json", - "Rev": "48046c6f120068248d1e115f4f9554d1bac539be" + "Rev": "2c348e07047b379e27a535228ee4fc30c3494a4b" }, { "ImportPath": "k8s.io/apimachinery/third_party/forked/golang/netutil", - "Rev": "48046c6f120068248d1e115f4f9554d1bac539be" + "Rev": "2c348e07047b379e27a535228ee4fc30c3494a4b" }, { "ImportPath": "k8s.io/apimachinery/third_party/forked/golang/reflect", - "Rev": "48046c6f120068248d1e115f4f9554d1bac539be" + "Rev": "2c348e07047b379e27a535228ee4fc30c3494a4b" }, { "ImportPath": "k8s.io/apiserver/pkg/admission", - "Rev": "a46833858d51325050151055cd21dc687ab654eb" + "Rev": "2455906e540b50825a95ba9d302196ce3f5d35ed" }, { "ImportPath": "k8s.io/apiserver/pkg/apis/apiserver", - "Rev": "a46833858d51325050151055cd21dc687ab654eb" + "Rev": "2455906e540b50825a95ba9d302196ce3f5d35ed" }, { "ImportPath": "k8s.io/apiserver/pkg/apis/apiserver/v1alpha1", - "Rev": "a46833858d51325050151055cd21dc687ab654eb" + "Rev": "2455906e540b50825a95ba9d302196ce3f5d35ed" }, { "ImportPath": "k8s.io/apiserver/pkg/apis/audit", - "Rev": "a46833858d51325050151055cd21dc687ab654eb" + "Rev": "2455906e540b50825a95ba9d302196ce3f5d35ed" }, { "ImportPath": "k8s.io/apiserver/pkg/apis/audit/v1", - "Rev": "a46833858d51325050151055cd21dc687ab654eb" + "Rev": "2455906e540b50825a95ba9d302196ce3f5d35ed" }, { "ImportPath": "k8s.io/apiserver/pkg/apis/audit/v1alpha1", - "Rev": "a46833858d51325050151055cd21dc687ab654eb" + "Rev": "2455906e540b50825a95ba9d302196ce3f5d35ed" }, { "ImportPath": "k8s.io/apiserver/pkg/apis/audit/v1beta1", - "Rev": "a46833858d51325050151055cd21dc687ab654eb" + "Rev": "2455906e540b50825a95ba9d302196ce3f5d35ed" }, { "ImportPath": "k8s.io/apiserver/pkg/apis/config", - "Rev": "a46833858d51325050151055cd21dc687ab654eb" + "Rev": "2455906e540b50825a95ba9d302196ce3f5d35ed" }, { "ImportPath": "k8s.io/apiserver/pkg/audit", - "Rev": "a46833858d51325050151055cd21dc687ab654eb" + "Rev": "2455906e540b50825a95ba9d302196ce3f5d35ed" }, { "ImportPath": "k8s.io/apiserver/pkg/authentication/authenticator", - "Rev": "a46833858d51325050151055cd21dc687ab654eb" + "Rev": "2455906e540b50825a95ba9d302196ce3f5d35ed" }, { "ImportPath": "k8s.io/apiserver/pkg/authentication/authenticatorfactory", - "Rev": "a46833858d51325050151055cd21dc687ab654eb" + "Rev": "2455906e540b50825a95ba9d302196ce3f5d35ed" }, { "ImportPath": "k8s.io/apiserver/pkg/authentication/group", - "Rev": "a46833858d51325050151055cd21dc687ab654eb" + "Rev": "2455906e540b50825a95ba9d302196ce3f5d35ed" }, { "ImportPath": "k8s.io/apiserver/pkg/authentication/request/anonymous", - "Rev": "a46833858d51325050151055cd21dc687ab654eb" + "Rev": "2455906e540b50825a95ba9d302196ce3f5d35ed" }, { "ImportPath": "k8s.io/apiserver/pkg/authentication/request/bearertoken", - "Rev": "a46833858d51325050151055cd21dc687ab654eb" + "Rev": "2455906e540b50825a95ba9d302196ce3f5d35ed" }, { "ImportPath": "k8s.io/apiserver/pkg/authentication/request/headerrequest", - "Rev": "a46833858d51325050151055cd21dc687ab654eb" + "Rev": "2455906e540b50825a95ba9d302196ce3f5d35ed" }, { "ImportPath": "k8s.io/apiserver/pkg/authentication/request/union", - "Rev": "a46833858d51325050151055cd21dc687ab654eb" + "Rev": "2455906e540b50825a95ba9d302196ce3f5d35ed" }, { "ImportPath": "k8s.io/apiserver/pkg/authentication/request/websocket", - "Rev": "a46833858d51325050151055cd21dc687ab654eb" + "Rev": "2455906e540b50825a95ba9d302196ce3f5d35ed" }, { "ImportPath": "k8s.io/apiserver/pkg/authentication/request/x509", - "Rev": "a46833858d51325050151055cd21dc687ab654eb" + "Rev": "2455906e540b50825a95ba9d302196ce3f5d35ed" }, { "ImportPath": "k8s.io/apiserver/pkg/authentication/serviceaccount", - "Rev": "a46833858d51325050151055cd21dc687ab654eb" + "Rev": "2455906e540b50825a95ba9d302196ce3f5d35ed" }, { "ImportPath": "k8s.io/apiserver/pkg/authentication/token/cache", - "Rev": "a46833858d51325050151055cd21dc687ab654eb" + "Rev": "2455906e540b50825a95ba9d302196ce3f5d35ed" }, { "ImportPath": "k8s.io/apiserver/pkg/authentication/token/tokenfile", - "Rev": "a46833858d51325050151055cd21dc687ab654eb" + "Rev": "2455906e540b50825a95ba9d302196ce3f5d35ed" }, { "ImportPath": "k8s.io/apiserver/pkg/authentication/user", - "Rev": "a46833858d51325050151055cd21dc687ab654eb" + "Rev": "2455906e540b50825a95ba9d302196ce3f5d35ed" }, { "ImportPath": "k8s.io/apiserver/pkg/authorization/authorizer", - "Rev": "a46833858d51325050151055cd21dc687ab654eb" + "Rev": "2455906e540b50825a95ba9d302196ce3f5d35ed" }, { "ImportPath": "k8s.io/apiserver/pkg/authorization/authorizerfactory", - "Rev": "a46833858d51325050151055cd21dc687ab654eb" + "Rev": "2455906e540b50825a95ba9d302196ce3f5d35ed" }, { "ImportPath": "k8s.io/apiserver/pkg/endpoints/handlers/negotiation", - "Rev": "a46833858d51325050151055cd21dc687ab654eb" + "Rev": "2455906e540b50825a95ba9d302196ce3f5d35ed" }, { "ImportPath": "k8s.io/apiserver/pkg/endpoints/handlers/responsewriters", - "Rev": "a46833858d51325050151055cd21dc687ab654eb" + "Rev": "2455906e540b50825a95ba9d302196ce3f5d35ed" }, { "ImportPath": "k8s.io/apiserver/pkg/endpoints/metrics", - "Rev": "a46833858d51325050151055cd21dc687ab654eb" + "Rev": "2455906e540b50825a95ba9d302196ce3f5d35ed" }, { "ImportPath": "k8s.io/apiserver/pkg/endpoints/request", - "Rev": "a46833858d51325050151055cd21dc687ab654eb" + "Rev": "2455906e540b50825a95ba9d302196ce3f5d35ed" }, { "ImportPath": "k8s.io/apiserver/pkg/features", - "Rev": "a46833858d51325050151055cd21dc687ab654eb" + "Rev": "2455906e540b50825a95ba9d302196ce3f5d35ed" }, { "ImportPath": "k8s.io/apiserver/pkg/registry/rest", - "Rev": "a46833858d51325050151055cd21dc687ab654eb" + "Rev": "2455906e540b50825a95ba9d302196ce3f5d35ed" }, { "ImportPath": "k8s.io/apiserver/pkg/server/healthz", - "Rev": "a46833858d51325050151055cd21dc687ab654eb" + "Rev": "2455906e540b50825a95ba9d302196ce3f5d35ed" }, { "ImportPath": "k8s.io/apiserver/pkg/server/httplog", - "Rev": "a46833858d51325050151055cd21dc687ab654eb" + "Rev": "2455906e540b50825a95ba9d302196ce3f5d35ed" }, { "ImportPath": "k8s.io/apiserver/pkg/server/mux", - "Rev": "a46833858d51325050151055cd21dc687ab654eb" + "Rev": "2455906e540b50825a95ba9d302196ce3f5d35ed" }, { "ImportPath": "k8s.io/apiserver/pkg/server/routes", - "Rev": "a46833858d51325050151055cd21dc687ab654eb" + "Rev": "2455906e540b50825a95ba9d302196ce3f5d35ed" }, { "ImportPath": "k8s.io/apiserver/pkg/server/routes/data/swagger", - "Rev": "a46833858d51325050151055cd21dc687ab654eb" + "Rev": "2455906e540b50825a95ba9d302196ce3f5d35ed" }, { "ImportPath": "k8s.io/apiserver/pkg/storage", - "Rev": "a46833858d51325050151055cd21dc687ab654eb" + "Rev": "2455906e540b50825a95ba9d302196ce3f5d35ed" }, { "ImportPath": "k8s.io/apiserver/pkg/storage/etcd", - "Rev": "a46833858d51325050151055cd21dc687ab654eb" + "Rev": "2455906e540b50825a95ba9d302196ce3f5d35ed" }, { "ImportPath": "k8s.io/apiserver/pkg/storage/etcd/metrics", - "Rev": "a46833858d51325050151055cd21dc687ab654eb" + "Rev": "2455906e540b50825a95ba9d302196ce3f5d35ed" }, { "ImportPath": "k8s.io/apiserver/pkg/storage/names", - "Rev": "a46833858d51325050151055cd21dc687ab654eb" + "Rev": "2455906e540b50825a95ba9d302196ce3f5d35ed" }, { "ImportPath": "k8s.io/apiserver/pkg/util/feature", - "Rev": "a46833858d51325050151055cd21dc687ab654eb" + "Rev": "2455906e540b50825a95ba9d302196ce3f5d35ed" }, { "ImportPath": "k8s.io/apiserver/pkg/util/flag", - "Rev": "a46833858d51325050151055cd21dc687ab654eb" + "Rev": "2455906e540b50825a95ba9d302196ce3f5d35ed" }, { "ImportPath": "k8s.io/apiserver/pkg/util/flushwriter", - "Rev": "a46833858d51325050151055cd21dc687ab654eb" + "Rev": "2455906e540b50825a95ba9d302196ce3f5d35ed" }, { "ImportPath": "k8s.io/apiserver/pkg/util/logs", - "Rev": "a46833858d51325050151055cd21dc687ab654eb" + "Rev": "2455906e540b50825a95ba9d302196ce3f5d35ed" }, { "ImportPath": "k8s.io/apiserver/pkg/util/trace", - "Rev": "a46833858d51325050151055cd21dc687ab654eb" + "Rev": "2455906e540b50825a95ba9d302196ce3f5d35ed" }, { "ImportPath": "k8s.io/apiserver/pkg/util/webhook", - "Rev": "a46833858d51325050151055cd21dc687ab654eb" + "Rev": "2455906e540b50825a95ba9d302196ce3f5d35ed" }, { "ImportPath": "k8s.io/apiserver/pkg/util/wsstream", - "Rev": "a46833858d51325050151055cd21dc687ab654eb" + "Rev": "2455906e540b50825a95ba9d302196ce3f5d35ed" }, { "ImportPath": "k8s.io/apiserver/plugin/pkg/authenticator/token/webhook", - "Rev": "a46833858d51325050151055cd21dc687ab654eb" + "Rev": "2455906e540b50825a95ba9d302196ce3f5d35ed" }, { "ImportPath": "k8s.io/apiserver/plugin/pkg/authorizer/webhook", - "Rev": "a46833858d51325050151055cd21dc687ab654eb" + "Rev": "2455906e540b50825a95ba9d302196ce3f5d35ed" }, { "ImportPath": "k8s.io/cli-runtime/pkg/genericclioptions", - "Rev": "4894e490c4cf4c3c3b2dbdd8209124bebf65f567" + "Rev": "b343932291a7c7cf39c33c80fed984ca7ab1e170" }, { "ImportPath": "k8s.io/cli-runtime/pkg/genericclioptions/printers", - "Rev": "4894e490c4cf4c3c3b2dbdd8209124bebf65f567" + "Rev": "b343932291a7c7cf39c33c80fed984ca7ab1e170" }, { "ImportPath": "k8s.io/cli-runtime/pkg/genericclioptions/resource", - "Rev": "4894e490c4cf4c3c3b2dbdd8209124bebf65f567" + "Rev": "b343932291a7c7cf39c33c80fed984ca7ab1e170" }, { "ImportPath": "k8s.io/client-go/discovery", - "Rev": "59c2a8cb4f132af26d4d8d3c2fc91605e43d17cd" + "Rev": "21ef9faa5ba9ffe9e2c8cd6b40b1d4ac306eadc0" }, { "ImportPath": "k8s.io/client-go/discovery/fake", - "Rev": "59c2a8cb4f132af26d4d8d3c2fc91605e43d17cd" + "Rev": "21ef9faa5ba9ffe9e2c8cd6b40b1d4ac306eadc0" }, { "ImportPath": "k8s.io/client-go/dynamic", - "Rev": "59c2a8cb4f132af26d4d8d3c2fc91605e43d17cd" + "Rev": "21ef9faa5ba9ffe9e2c8cd6b40b1d4ac306eadc0" }, { "ImportPath": "k8s.io/client-go/informers", - "Rev": "59c2a8cb4f132af26d4d8d3c2fc91605e43d17cd" + "Rev": "21ef9faa5ba9ffe9e2c8cd6b40b1d4ac306eadc0" }, { "ImportPath": "k8s.io/client-go/informers/admissionregistration", - "Rev": "59c2a8cb4f132af26d4d8d3c2fc91605e43d17cd" + "Rev": "21ef9faa5ba9ffe9e2c8cd6b40b1d4ac306eadc0" }, { "ImportPath": "k8s.io/client-go/informers/admissionregistration/v1alpha1", - "Rev": "59c2a8cb4f132af26d4d8d3c2fc91605e43d17cd" + "Rev": "21ef9faa5ba9ffe9e2c8cd6b40b1d4ac306eadc0" }, { "ImportPath": "k8s.io/client-go/informers/admissionregistration/v1beta1", - "Rev": "59c2a8cb4f132af26d4d8d3c2fc91605e43d17cd" + "Rev": "21ef9faa5ba9ffe9e2c8cd6b40b1d4ac306eadc0" }, { "ImportPath": "k8s.io/client-go/informers/apps", - "Rev": "59c2a8cb4f132af26d4d8d3c2fc91605e43d17cd" + "Rev": "21ef9faa5ba9ffe9e2c8cd6b40b1d4ac306eadc0" }, { "ImportPath": "k8s.io/client-go/informers/apps/v1", - "Rev": "59c2a8cb4f132af26d4d8d3c2fc91605e43d17cd" + "Rev": "21ef9faa5ba9ffe9e2c8cd6b40b1d4ac306eadc0" }, { "ImportPath": "k8s.io/client-go/informers/apps/v1beta1", - "Rev": "59c2a8cb4f132af26d4d8d3c2fc91605e43d17cd" + "Rev": "21ef9faa5ba9ffe9e2c8cd6b40b1d4ac306eadc0" }, { "ImportPath": "k8s.io/client-go/informers/apps/v1beta2", - "Rev": "59c2a8cb4f132af26d4d8d3c2fc91605e43d17cd" + "Rev": "21ef9faa5ba9ffe9e2c8cd6b40b1d4ac306eadc0" }, { "ImportPath": "k8s.io/client-go/informers/auditregistration", - "Rev": "59c2a8cb4f132af26d4d8d3c2fc91605e43d17cd" + "Rev": "21ef9faa5ba9ffe9e2c8cd6b40b1d4ac306eadc0" }, { "ImportPath": "k8s.io/client-go/informers/auditregistration/v1alpha1", - "Rev": "59c2a8cb4f132af26d4d8d3c2fc91605e43d17cd" + "Rev": "21ef9faa5ba9ffe9e2c8cd6b40b1d4ac306eadc0" }, { "ImportPath": "k8s.io/client-go/informers/autoscaling", - "Rev": "59c2a8cb4f132af26d4d8d3c2fc91605e43d17cd" + "Rev": "21ef9faa5ba9ffe9e2c8cd6b40b1d4ac306eadc0" }, { "ImportPath": "k8s.io/client-go/informers/autoscaling/v1", - "Rev": "59c2a8cb4f132af26d4d8d3c2fc91605e43d17cd" + "Rev": "21ef9faa5ba9ffe9e2c8cd6b40b1d4ac306eadc0" }, { "ImportPath": "k8s.io/client-go/informers/autoscaling/v2beta1", - "Rev": "59c2a8cb4f132af26d4d8d3c2fc91605e43d17cd" + "Rev": "21ef9faa5ba9ffe9e2c8cd6b40b1d4ac306eadc0" }, { "ImportPath": "k8s.io/client-go/informers/autoscaling/v2beta2", - "Rev": "59c2a8cb4f132af26d4d8d3c2fc91605e43d17cd" + "Rev": "21ef9faa5ba9ffe9e2c8cd6b40b1d4ac306eadc0" }, { "ImportPath": "k8s.io/client-go/informers/batch", - "Rev": "59c2a8cb4f132af26d4d8d3c2fc91605e43d17cd" + "Rev": "21ef9faa5ba9ffe9e2c8cd6b40b1d4ac306eadc0" }, { "ImportPath": "k8s.io/client-go/informers/batch/v1", - "Rev": "59c2a8cb4f132af26d4d8d3c2fc91605e43d17cd" + "Rev": "21ef9faa5ba9ffe9e2c8cd6b40b1d4ac306eadc0" }, { "ImportPath": "k8s.io/client-go/informers/batch/v1beta1", - "Rev": "59c2a8cb4f132af26d4d8d3c2fc91605e43d17cd" + "Rev": "21ef9faa5ba9ffe9e2c8cd6b40b1d4ac306eadc0" }, { "ImportPath": "k8s.io/client-go/informers/batch/v2alpha1", - "Rev": "59c2a8cb4f132af26d4d8d3c2fc91605e43d17cd" + "Rev": "21ef9faa5ba9ffe9e2c8cd6b40b1d4ac306eadc0" }, { "ImportPath": "k8s.io/client-go/informers/certificates", - "Rev": "59c2a8cb4f132af26d4d8d3c2fc91605e43d17cd" + "Rev": "21ef9faa5ba9ffe9e2c8cd6b40b1d4ac306eadc0" }, { "ImportPath": "k8s.io/client-go/informers/certificates/v1beta1", - "Rev": "59c2a8cb4f132af26d4d8d3c2fc91605e43d17cd" + "Rev": "21ef9faa5ba9ffe9e2c8cd6b40b1d4ac306eadc0" }, { "ImportPath": "k8s.io/client-go/informers/coordination", - "Rev": "59c2a8cb4f132af26d4d8d3c2fc91605e43d17cd" + "Rev": "21ef9faa5ba9ffe9e2c8cd6b40b1d4ac306eadc0" }, { "ImportPath": "k8s.io/client-go/informers/coordination/v1beta1", - "Rev": "59c2a8cb4f132af26d4d8d3c2fc91605e43d17cd" + "Rev": "21ef9faa5ba9ffe9e2c8cd6b40b1d4ac306eadc0" }, { "ImportPath": "k8s.io/client-go/informers/core", - "Rev": "59c2a8cb4f132af26d4d8d3c2fc91605e43d17cd" + "Rev": "21ef9faa5ba9ffe9e2c8cd6b40b1d4ac306eadc0" }, { "ImportPath": "k8s.io/client-go/informers/core/v1", - "Rev": "59c2a8cb4f132af26d4d8d3c2fc91605e43d17cd" + "Rev": "21ef9faa5ba9ffe9e2c8cd6b40b1d4ac306eadc0" }, { "ImportPath": "k8s.io/client-go/informers/events", - "Rev": "59c2a8cb4f132af26d4d8d3c2fc91605e43d17cd" + "Rev": "21ef9faa5ba9ffe9e2c8cd6b40b1d4ac306eadc0" }, { "ImportPath": "k8s.io/client-go/informers/events/v1beta1", - "Rev": "59c2a8cb4f132af26d4d8d3c2fc91605e43d17cd" + "Rev": "21ef9faa5ba9ffe9e2c8cd6b40b1d4ac306eadc0" }, { "ImportPath": "k8s.io/client-go/informers/extensions", - "Rev": "59c2a8cb4f132af26d4d8d3c2fc91605e43d17cd" + "Rev": "21ef9faa5ba9ffe9e2c8cd6b40b1d4ac306eadc0" }, { "ImportPath": "k8s.io/client-go/informers/extensions/v1beta1", - "Rev": "59c2a8cb4f132af26d4d8d3c2fc91605e43d17cd" + "Rev": "21ef9faa5ba9ffe9e2c8cd6b40b1d4ac306eadc0" }, { "ImportPath": "k8s.io/client-go/informers/internalinterfaces", - "Rev": "59c2a8cb4f132af26d4d8d3c2fc91605e43d17cd" + "Rev": "21ef9faa5ba9ffe9e2c8cd6b40b1d4ac306eadc0" }, { "ImportPath": "k8s.io/client-go/informers/networking", - "Rev": "59c2a8cb4f132af26d4d8d3c2fc91605e43d17cd" + "Rev": "21ef9faa5ba9ffe9e2c8cd6b40b1d4ac306eadc0" }, { "ImportPath": "k8s.io/client-go/informers/networking/v1", - "Rev": "59c2a8cb4f132af26d4d8d3c2fc91605e43d17cd" + "Rev": "21ef9faa5ba9ffe9e2c8cd6b40b1d4ac306eadc0" }, { "ImportPath": "k8s.io/client-go/informers/policy", - "Rev": "59c2a8cb4f132af26d4d8d3c2fc91605e43d17cd" + "Rev": "21ef9faa5ba9ffe9e2c8cd6b40b1d4ac306eadc0" }, { "ImportPath": "k8s.io/client-go/informers/policy/v1beta1", - "Rev": "59c2a8cb4f132af26d4d8d3c2fc91605e43d17cd" + "Rev": "21ef9faa5ba9ffe9e2c8cd6b40b1d4ac306eadc0" }, { "ImportPath": "k8s.io/client-go/informers/rbac", - "Rev": "59c2a8cb4f132af26d4d8d3c2fc91605e43d17cd" + "Rev": "21ef9faa5ba9ffe9e2c8cd6b40b1d4ac306eadc0" }, { "ImportPath": "k8s.io/client-go/informers/rbac/v1", - "Rev": "59c2a8cb4f132af26d4d8d3c2fc91605e43d17cd" + "Rev": "21ef9faa5ba9ffe9e2c8cd6b40b1d4ac306eadc0" }, { "ImportPath": "k8s.io/client-go/informers/rbac/v1alpha1", - "Rev": "59c2a8cb4f132af26d4d8d3c2fc91605e43d17cd" + "Rev": "21ef9faa5ba9ffe9e2c8cd6b40b1d4ac306eadc0" }, { "ImportPath": "k8s.io/client-go/informers/rbac/v1beta1", - "Rev": "59c2a8cb4f132af26d4d8d3c2fc91605e43d17cd" + "Rev": "21ef9faa5ba9ffe9e2c8cd6b40b1d4ac306eadc0" }, { "ImportPath": "k8s.io/client-go/informers/scheduling", - "Rev": "59c2a8cb4f132af26d4d8d3c2fc91605e43d17cd" + "Rev": "21ef9faa5ba9ffe9e2c8cd6b40b1d4ac306eadc0" }, { "ImportPath": "k8s.io/client-go/informers/scheduling/v1alpha1", - "Rev": "59c2a8cb4f132af26d4d8d3c2fc91605e43d17cd" + "Rev": "21ef9faa5ba9ffe9e2c8cd6b40b1d4ac306eadc0" }, { "ImportPath": "k8s.io/client-go/informers/scheduling/v1beta1", - "Rev": "59c2a8cb4f132af26d4d8d3c2fc91605e43d17cd" + "Rev": "21ef9faa5ba9ffe9e2c8cd6b40b1d4ac306eadc0" }, { "ImportPath": "k8s.io/client-go/informers/settings", - "Rev": "59c2a8cb4f132af26d4d8d3c2fc91605e43d17cd" + "Rev": "21ef9faa5ba9ffe9e2c8cd6b40b1d4ac306eadc0" }, { "ImportPath": "k8s.io/client-go/informers/settings/v1alpha1", - "Rev": "59c2a8cb4f132af26d4d8d3c2fc91605e43d17cd" + "Rev": "21ef9faa5ba9ffe9e2c8cd6b40b1d4ac306eadc0" }, { "ImportPath": "k8s.io/client-go/informers/storage", - "Rev": "59c2a8cb4f132af26d4d8d3c2fc91605e43d17cd" + "Rev": "21ef9faa5ba9ffe9e2c8cd6b40b1d4ac306eadc0" }, { "ImportPath": "k8s.io/client-go/informers/storage/v1", - "Rev": "59c2a8cb4f132af26d4d8d3c2fc91605e43d17cd" + "Rev": "21ef9faa5ba9ffe9e2c8cd6b40b1d4ac306eadc0" }, { "ImportPath": "k8s.io/client-go/informers/storage/v1alpha1", - "Rev": "59c2a8cb4f132af26d4d8d3c2fc91605e43d17cd" + "Rev": "21ef9faa5ba9ffe9e2c8cd6b40b1d4ac306eadc0" }, { "ImportPath": "k8s.io/client-go/informers/storage/v1beta1", - "Rev": "59c2a8cb4f132af26d4d8d3c2fc91605e43d17cd" + "Rev": "21ef9faa5ba9ffe9e2c8cd6b40b1d4ac306eadc0" }, { "ImportPath": "k8s.io/client-go/kubernetes", - "Rev": "59c2a8cb4f132af26d4d8d3c2fc91605e43d17cd" + "Rev": "21ef9faa5ba9ffe9e2c8cd6b40b1d4ac306eadc0" }, { "ImportPath": "k8s.io/client-go/kubernetes/fake", - "Rev": "59c2a8cb4f132af26d4d8d3c2fc91605e43d17cd" + "Rev": "21ef9faa5ba9ffe9e2c8cd6b40b1d4ac306eadc0" }, { "ImportPath": "k8s.io/client-go/kubernetes/scheme", - "Rev": "59c2a8cb4f132af26d4d8d3c2fc91605e43d17cd" + "Rev": "21ef9faa5ba9ffe9e2c8cd6b40b1d4ac306eadc0" }, { "ImportPath": "k8s.io/client-go/kubernetes/typed/admissionregistration/v1alpha1", - "Rev": "59c2a8cb4f132af26d4d8d3c2fc91605e43d17cd" + "Rev": "21ef9faa5ba9ffe9e2c8cd6b40b1d4ac306eadc0" }, { "ImportPath": "k8s.io/client-go/kubernetes/typed/admissionregistration/v1alpha1/fake", - "Rev": "59c2a8cb4f132af26d4d8d3c2fc91605e43d17cd" + "Rev": "21ef9faa5ba9ffe9e2c8cd6b40b1d4ac306eadc0" }, { "ImportPath": "k8s.io/client-go/kubernetes/typed/admissionregistration/v1beta1", - "Rev": "59c2a8cb4f132af26d4d8d3c2fc91605e43d17cd" + "Rev": "21ef9faa5ba9ffe9e2c8cd6b40b1d4ac306eadc0" }, { "ImportPath": "k8s.io/client-go/kubernetes/typed/admissionregistration/v1beta1/fake", - "Rev": "59c2a8cb4f132af26d4d8d3c2fc91605e43d17cd" + "Rev": "21ef9faa5ba9ffe9e2c8cd6b40b1d4ac306eadc0" }, { "ImportPath": "k8s.io/client-go/kubernetes/typed/apps/v1", - "Rev": "59c2a8cb4f132af26d4d8d3c2fc91605e43d17cd" + "Rev": "21ef9faa5ba9ffe9e2c8cd6b40b1d4ac306eadc0" }, { "ImportPath": "k8s.io/client-go/kubernetes/typed/apps/v1/fake", - "Rev": "59c2a8cb4f132af26d4d8d3c2fc91605e43d17cd" + "Rev": "21ef9faa5ba9ffe9e2c8cd6b40b1d4ac306eadc0" }, { "ImportPath": "k8s.io/client-go/kubernetes/typed/apps/v1beta1", - "Rev": "59c2a8cb4f132af26d4d8d3c2fc91605e43d17cd" + "Rev": "21ef9faa5ba9ffe9e2c8cd6b40b1d4ac306eadc0" }, { "ImportPath": "k8s.io/client-go/kubernetes/typed/apps/v1beta1/fake", - "Rev": "59c2a8cb4f132af26d4d8d3c2fc91605e43d17cd" + "Rev": "21ef9faa5ba9ffe9e2c8cd6b40b1d4ac306eadc0" }, { "ImportPath": "k8s.io/client-go/kubernetes/typed/apps/v1beta2", - "Rev": "59c2a8cb4f132af26d4d8d3c2fc91605e43d17cd" + "Rev": "21ef9faa5ba9ffe9e2c8cd6b40b1d4ac306eadc0" }, { "ImportPath": "k8s.io/client-go/kubernetes/typed/apps/v1beta2/fake", - "Rev": "59c2a8cb4f132af26d4d8d3c2fc91605e43d17cd" + "Rev": "21ef9faa5ba9ffe9e2c8cd6b40b1d4ac306eadc0" }, { "ImportPath": "k8s.io/client-go/kubernetes/typed/auditregistration/v1alpha1", - "Rev": "59c2a8cb4f132af26d4d8d3c2fc91605e43d17cd" + "Rev": "21ef9faa5ba9ffe9e2c8cd6b40b1d4ac306eadc0" }, { "ImportPath": "k8s.io/client-go/kubernetes/typed/auditregistration/v1alpha1/fake", - "Rev": "59c2a8cb4f132af26d4d8d3c2fc91605e43d17cd" + "Rev": "21ef9faa5ba9ffe9e2c8cd6b40b1d4ac306eadc0" }, { "ImportPath": "k8s.io/client-go/kubernetes/typed/authentication/v1", - "Rev": "59c2a8cb4f132af26d4d8d3c2fc91605e43d17cd" + "Rev": "21ef9faa5ba9ffe9e2c8cd6b40b1d4ac306eadc0" }, { "ImportPath": "k8s.io/client-go/kubernetes/typed/authentication/v1/fake", - "Rev": "59c2a8cb4f132af26d4d8d3c2fc91605e43d17cd" + "Rev": "21ef9faa5ba9ffe9e2c8cd6b40b1d4ac306eadc0" }, { "ImportPath": "k8s.io/client-go/kubernetes/typed/authentication/v1beta1", - "Rev": "59c2a8cb4f132af26d4d8d3c2fc91605e43d17cd" + "Rev": "21ef9faa5ba9ffe9e2c8cd6b40b1d4ac306eadc0" }, { "ImportPath": "k8s.io/client-go/kubernetes/typed/authentication/v1beta1/fake", - "Rev": "59c2a8cb4f132af26d4d8d3c2fc91605e43d17cd" + "Rev": "21ef9faa5ba9ffe9e2c8cd6b40b1d4ac306eadc0" }, { "ImportPath": "k8s.io/client-go/kubernetes/typed/authorization/v1", - "Rev": "59c2a8cb4f132af26d4d8d3c2fc91605e43d17cd" + "Rev": "21ef9faa5ba9ffe9e2c8cd6b40b1d4ac306eadc0" }, { "ImportPath": "k8s.io/client-go/kubernetes/typed/authorization/v1/fake", - "Rev": "59c2a8cb4f132af26d4d8d3c2fc91605e43d17cd" + "Rev": "21ef9faa5ba9ffe9e2c8cd6b40b1d4ac306eadc0" }, { "ImportPath": "k8s.io/client-go/kubernetes/typed/authorization/v1beta1", - "Rev": "59c2a8cb4f132af26d4d8d3c2fc91605e43d17cd" + "Rev": "21ef9faa5ba9ffe9e2c8cd6b40b1d4ac306eadc0" }, { "ImportPath": "k8s.io/client-go/kubernetes/typed/authorization/v1beta1/fake", - "Rev": "59c2a8cb4f132af26d4d8d3c2fc91605e43d17cd" + "Rev": "21ef9faa5ba9ffe9e2c8cd6b40b1d4ac306eadc0" }, { "ImportPath": "k8s.io/client-go/kubernetes/typed/autoscaling/v1", - "Rev": "59c2a8cb4f132af26d4d8d3c2fc91605e43d17cd" + "Rev": "21ef9faa5ba9ffe9e2c8cd6b40b1d4ac306eadc0" }, { "ImportPath": "k8s.io/client-go/kubernetes/typed/autoscaling/v1/fake", - "Rev": "59c2a8cb4f132af26d4d8d3c2fc91605e43d17cd" + "Rev": "21ef9faa5ba9ffe9e2c8cd6b40b1d4ac306eadc0" }, { "ImportPath": "k8s.io/client-go/kubernetes/typed/autoscaling/v2beta1", - "Rev": "59c2a8cb4f132af26d4d8d3c2fc91605e43d17cd" + "Rev": "21ef9faa5ba9ffe9e2c8cd6b40b1d4ac306eadc0" }, { "ImportPath": "k8s.io/client-go/kubernetes/typed/autoscaling/v2beta1/fake", - "Rev": "59c2a8cb4f132af26d4d8d3c2fc91605e43d17cd" + "Rev": "21ef9faa5ba9ffe9e2c8cd6b40b1d4ac306eadc0" }, { "ImportPath": "k8s.io/client-go/kubernetes/typed/autoscaling/v2beta2", - "Rev": "59c2a8cb4f132af26d4d8d3c2fc91605e43d17cd" + "Rev": "21ef9faa5ba9ffe9e2c8cd6b40b1d4ac306eadc0" }, { "ImportPath": "k8s.io/client-go/kubernetes/typed/autoscaling/v2beta2/fake", - "Rev": "59c2a8cb4f132af26d4d8d3c2fc91605e43d17cd" + "Rev": "21ef9faa5ba9ffe9e2c8cd6b40b1d4ac306eadc0" }, { "ImportPath": "k8s.io/client-go/kubernetes/typed/batch/v1", - "Rev": "59c2a8cb4f132af26d4d8d3c2fc91605e43d17cd" + "Rev": "21ef9faa5ba9ffe9e2c8cd6b40b1d4ac306eadc0" }, { "ImportPath": "k8s.io/client-go/kubernetes/typed/batch/v1/fake", - "Rev": "59c2a8cb4f132af26d4d8d3c2fc91605e43d17cd" + "Rev": "21ef9faa5ba9ffe9e2c8cd6b40b1d4ac306eadc0" }, { "ImportPath": "k8s.io/client-go/kubernetes/typed/batch/v1beta1", - "Rev": "59c2a8cb4f132af26d4d8d3c2fc91605e43d17cd" + "Rev": "21ef9faa5ba9ffe9e2c8cd6b40b1d4ac306eadc0" }, { "ImportPath": "k8s.io/client-go/kubernetes/typed/batch/v1beta1/fake", - "Rev": "59c2a8cb4f132af26d4d8d3c2fc91605e43d17cd" + "Rev": "21ef9faa5ba9ffe9e2c8cd6b40b1d4ac306eadc0" }, { "ImportPath": "k8s.io/client-go/kubernetes/typed/batch/v2alpha1", - "Rev": "59c2a8cb4f132af26d4d8d3c2fc91605e43d17cd" + "Rev": "21ef9faa5ba9ffe9e2c8cd6b40b1d4ac306eadc0" }, { "ImportPath": "k8s.io/client-go/kubernetes/typed/batch/v2alpha1/fake", - "Rev": "59c2a8cb4f132af26d4d8d3c2fc91605e43d17cd" + "Rev": "21ef9faa5ba9ffe9e2c8cd6b40b1d4ac306eadc0" }, { "ImportPath": "k8s.io/client-go/kubernetes/typed/certificates/v1beta1", - "Rev": "59c2a8cb4f132af26d4d8d3c2fc91605e43d17cd" + "Rev": "21ef9faa5ba9ffe9e2c8cd6b40b1d4ac306eadc0" }, { "ImportPath": "k8s.io/client-go/kubernetes/typed/certificates/v1beta1/fake", - "Rev": "59c2a8cb4f132af26d4d8d3c2fc91605e43d17cd" + "Rev": "21ef9faa5ba9ffe9e2c8cd6b40b1d4ac306eadc0" }, { "ImportPath": "k8s.io/client-go/kubernetes/typed/coordination/v1beta1", - "Rev": "59c2a8cb4f132af26d4d8d3c2fc91605e43d17cd" + "Rev": "21ef9faa5ba9ffe9e2c8cd6b40b1d4ac306eadc0" }, { "ImportPath": "k8s.io/client-go/kubernetes/typed/coordination/v1beta1/fake", - "Rev": "59c2a8cb4f132af26d4d8d3c2fc91605e43d17cd" + "Rev": "21ef9faa5ba9ffe9e2c8cd6b40b1d4ac306eadc0" }, { "ImportPath": "k8s.io/client-go/kubernetes/typed/core/v1", - "Rev": "59c2a8cb4f132af26d4d8d3c2fc91605e43d17cd" + "Rev": "21ef9faa5ba9ffe9e2c8cd6b40b1d4ac306eadc0" }, { "ImportPath": "k8s.io/client-go/kubernetes/typed/core/v1/fake", - "Rev": "59c2a8cb4f132af26d4d8d3c2fc91605e43d17cd" + "Rev": "21ef9faa5ba9ffe9e2c8cd6b40b1d4ac306eadc0" }, { "ImportPath": "k8s.io/client-go/kubernetes/typed/events/v1beta1", - "Rev": "59c2a8cb4f132af26d4d8d3c2fc91605e43d17cd" + "Rev": "21ef9faa5ba9ffe9e2c8cd6b40b1d4ac306eadc0" }, { "ImportPath": "k8s.io/client-go/kubernetes/typed/events/v1beta1/fake", - "Rev": "59c2a8cb4f132af26d4d8d3c2fc91605e43d17cd" + "Rev": "21ef9faa5ba9ffe9e2c8cd6b40b1d4ac306eadc0" }, { "ImportPath": "k8s.io/client-go/kubernetes/typed/extensions/v1beta1", - "Rev": "59c2a8cb4f132af26d4d8d3c2fc91605e43d17cd" + "Rev": "21ef9faa5ba9ffe9e2c8cd6b40b1d4ac306eadc0" }, { "ImportPath": "k8s.io/client-go/kubernetes/typed/extensions/v1beta1/fake", - "Rev": "59c2a8cb4f132af26d4d8d3c2fc91605e43d17cd" + "Rev": "21ef9faa5ba9ffe9e2c8cd6b40b1d4ac306eadc0" }, { "ImportPath": "k8s.io/client-go/kubernetes/typed/networking/v1", - "Rev": "59c2a8cb4f132af26d4d8d3c2fc91605e43d17cd" + "Rev": "21ef9faa5ba9ffe9e2c8cd6b40b1d4ac306eadc0" }, { "ImportPath": "k8s.io/client-go/kubernetes/typed/networking/v1/fake", - "Rev": "59c2a8cb4f132af26d4d8d3c2fc91605e43d17cd" + "Rev": "21ef9faa5ba9ffe9e2c8cd6b40b1d4ac306eadc0" }, { "ImportPath": "k8s.io/client-go/kubernetes/typed/policy/v1beta1", - "Rev": "59c2a8cb4f132af26d4d8d3c2fc91605e43d17cd" + "Rev": "21ef9faa5ba9ffe9e2c8cd6b40b1d4ac306eadc0" }, { "ImportPath": "k8s.io/client-go/kubernetes/typed/policy/v1beta1/fake", - "Rev": "59c2a8cb4f132af26d4d8d3c2fc91605e43d17cd" + "Rev": "21ef9faa5ba9ffe9e2c8cd6b40b1d4ac306eadc0" }, { "ImportPath": "k8s.io/client-go/kubernetes/typed/rbac/v1", - "Rev": "59c2a8cb4f132af26d4d8d3c2fc91605e43d17cd" + "Rev": "21ef9faa5ba9ffe9e2c8cd6b40b1d4ac306eadc0" }, { "ImportPath": "k8s.io/client-go/kubernetes/typed/rbac/v1/fake", - "Rev": "59c2a8cb4f132af26d4d8d3c2fc91605e43d17cd" + "Rev": "21ef9faa5ba9ffe9e2c8cd6b40b1d4ac306eadc0" }, { "ImportPath": "k8s.io/client-go/kubernetes/typed/rbac/v1alpha1", - "Rev": "59c2a8cb4f132af26d4d8d3c2fc91605e43d17cd" + "Rev": "21ef9faa5ba9ffe9e2c8cd6b40b1d4ac306eadc0" }, { "ImportPath": "k8s.io/client-go/kubernetes/typed/rbac/v1alpha1/fake", - "Rev": "59c2a8cb4f132af26d4d8d3c2fc91605e43d17cd" + "Rev": "21ef9faa5ba9ffe9e2c8cd6b40b1d4ac306eadc0" }, { "ImportPath": "k8s.io/client-go/kubernetes/typed/rbac/v1beta1", - "Rev": "59c2a8cb4f132af26d4d8d3c2fc91605e43d17cd" + "Rev": "21ef9faa5ba9ffe9e2c8cd6b40b1d4ac306eadc0" }, { "ImportPath": "k8s.io/client-go/kubernetes/typed/rbac/v1beta1/fake", - "Rev": "59c2a8cb4f132af26d4d8d3c2fc91605e43d17cd" + "Rev": "21ef9faa5ba9ffe9e2c8cd6b40b1d4ac306eadc0" }, { "ImportPath": "k8s.io/client-go/kubernetes/typed/scheduling/v1alpha1", - "Rev": "59c2a8cb4f132af26d4d8d3c2fc91605e43d17cd" + "Rev": "21ef9faa5ba9ffe9e2c8cd6b40b1d4ac306eadc0" }, { "ImportPath": "k8s.io/client-go/kubernetes/typed/scheduling/v1alpha1/fake", - "Rev": "59c2a8cb4f132af26d4d8d3c2fc91605e43d17cd" + "Rev": "21ef9faa5ba9ffe9e2c8cd6b40b1d4ac306eadc0" }, { "ImportPath": "k8s.io/client-go/kubernetes/typed/scheduling/v1beta1", - "Rev": "59c2a8cb4f132af26d4d8d3c2fc91605e43d17cd" + "Rev": "21ef9faa5ba9ffe9e2c8cd6b40b1d4ac306eadc0" }, { "ImportPath": "k8s.io/client-go/kubernetes/typed/scheduling/v1beta1/fake", - "Rev": "59c2a8cb4f132af26d4d8d3c2fc91605e43d17cd" + "Rev": "21ef9faa5ba9ffe9e2c8cd6b40b1d4ac306eadc0" }, { "ImportPath": "k8s.io/client-go/kubernetes/typed/settings/v1alpha1", - "Rev": "59c2a8cb4f132af26d4d8d3c2fc91605e43d17cd" + "Rev": "21ef9faa5ba9ffe9e2c8cd6b40b1d4ac306eadc0" }, { "ImportPath": "k8s.io/client-go/kubernetes/typed/settings/v1alpha1/fake", - "Rev": "59c2a8cb4f132af26d4d8d3c2fc91605e43d17cd" + "Rev": "21ef9faa5ba9ffe9e2c8cd6b40b1d4ac306eadc0" }, { "ImportPath": "k8s.io/client-go/kubernetes/typed/storage/v1", - "Rev": "59c2a8cb4f132af26d4d8d3c2fc91605e43d17cd" + "Rev": "21ef9faa5ba9ffe9e2c8cd6b40b1d4ac306eadc0" }, { "ImportPath": "k8s.io/client-go/kubernetes/typed/storage/v1/fake", - "Rev": "59c2a8cb4f132af26d4d8d3c2fc91605e43d17cd" + "Rev": "21ef9faa5ba9ffe9e2c8cd6b40b1d4ac306eadc0" }, { "ImportPath": "k8s.io/client-go/kubernetes/typed/storage/v1alpha1", - "Rev": "59c2a8cb4f132af26d4d8d3c2fc91605e43d17cd" + "Rev": "21ef9faa5ba9ffe9e2c8cd6b40b1d4ac306eadc0" }, { "ImportPath": "k8s.io/client-go/kubernetes/typed/storage/v1alpha1/fake", - "Rev": "59c2a8cb4f132af26d4d8d3c2fc91605e43d17cd" + "Rev": "21ef9faa5ba9ffe9e2c8cd6b40b1d4ac306eadc0" }, { "ImportPath": "k8s.io/client-go/kubernetes/typed/storage/v1beta1", - "Rev": "59c2a8cb4f132af26d4d8d3c2fc91605e43d17cd" + "Rev": "21ef9faa5ba9ffe9e2c8cd6b40b1d4ac306eadc0" }, { "ImportPath": "k8s.io/client-go/kubernetes/typed/storage/v1beta1/fake", - "Rev": "59c2a8cb4f132af26d4d8d3c2fc91605e43d17cd" + "Rev": "21ef9faa5ba9ffe9e2c8cd6b40b1d4ac306eadc0" }, { "ImportPath": "k8s.io/client-go/listers/admissionregistration/v1alpha1", - "Rev": "59c2a8cb4f132af26d4d8d3c2fc91605e43d17cd" + "Rev": "21ef9faa5ba9ffe9e2c8cd6b40b1d4ac306eadc0" }, { "ImportPath": "k8s.io/client-go/listers/admissionregistration/v1beta1", - "Rev": "59c2a8cb4f132af26d4d8d3c2fc91605e43d17cd" + "Rev": "21ef9faa5ba9ffe9e2c8cd6b40b1d4ac306eadc0" }, { "ImportPath": "k8s.io/client-go/listers/apps/v1", - "Rev": "59c2a8cb4f132af26d4d8d3c2fc91605e43d17cd" + "Rev": "21ef9faa5ba9ffe9e2c8cd6b40b1d4ac306eadc0" }, { "ImportPath": "k8s.io/client-go/listers/apps/v1beta1", - "Rev": "59c2a8cb4f132af26d4d8d3c2fc91605e43d17cd" + "Rev": "21ef9faa5ba9ffe9e2c8cd6b40b1d4ac306eadc0" }, { "ImportPath": "k8s.io/client-go/listers/apps/v1beta2", - "Rev": "59c2a8cb4f132af26d4d8d3c2fc91605e43d17cd" + "Rev": "21ef9faa5ba9ffe9e2c8cd6b40b1d4ac306eadc0" }, { "ImportPath": "k8s.io/client-go/listers/auditregistration/v1alpha1", - "Rev": "59c2a8cb4f132af26d4d8d3c2fc91605e43d17cd" + "Rev": "21ef9faa5ba9ffe9e2c8cd6b40b1d4ac306eadc0" }, { "ImportPath": "k8s.io/client-go/listers/autoscaling/v1", - "Rev": "59c2a8cb4f132af26d4d8d3c2fc91605e43d17cd" + "Rev": "21ef9faa5ba9ffe9e2c8cd6b40b1d4ac306eadc0" }, { "ImportPath": "k8s.io/client-go/listers/autoscaling/v2beta1", - "Rev": "59c2a8cb4f132af26d4d8d3c2fc91605e43d17cd" + "Rev": "21ef9faa5ba9ffe9e2c8cd6b40b1d4ac306eadc0" }, { "ImportPath": "k8s.io/client-go/listers/autoscaling/v2beta2", - "Rev": "59c2a8cb4f132af26d4d8d3c2fc91605e43d17cd" + "Rev": "21ef9faa5ba9ffe9e2c8cd6b40b1d4ac306eadc0" }, { "ImportPath": "k8s.io/client-go/listers/batch/v1", - "Rev": "59c2a8cb4f132af26d4d8d3c2fc91605e43d17cd" + "Rev": "21ef9faa5ba9ffe9e2c8cd6b40b1d4ac306eadc0" }, { "ImportPath": "k8s.io/client-go/listers/batch/v1beta1", - "Rev": "59c2a8cb4f132af26d4d8d3c2fc91605e43d17cd" + "Rev": "21ef9faa5ba9ffe9e2c8cd6b40b1d4ac306eadc0" }, { "ImportPath": "k8s.io/client-go/listers/batch/v2alpha1", - "Rev": "59c2a8cb4f132af26d4d8d3c2fc91605e43d17cd" + "Rev": "21ef9faa5ba9ffe9e2c8cd6b40b1d4ac306eadc0" }, { "ImportPath": "k8s.io/client-go/listers/certificates/v1beta1", - "Rev": "59c2a8cb4f132af26d4d8d3c2fc91605e43d17cd" + "Rev": "21ef9faa5ba9ffe9e2c8cd6b40b1d4ac306eadc0" }, { "ImportPath": "k8s.io/client-go/listers/coordination/v1beta1", - "Rev": "59c2a8cb4f132af26d4d8d3c2fc91605e43d17cd" + "Rev": "21ef9faa5ba9ffe9e2c8cd6b40b1d4ac306eadc0" }, { "ImportPath": "k8s.io/client-go/listers/core/v1", - "Rev": "59c2a8cb4f132af26d4d8d3c2fc91605e43d17cd" + "Rev": "21ef9faa5ba9ffe9e2c8cd6b40b1d4ac306eadc0" }, { "ImportPath": "k8s.io/client-go/listers/events/v1beta1", - "Rev": "59c2a8cb4f132af26d4d8d3c2fc91605e43d17cd" + "Rev": "21ef9faa5ba9ffe9e2c8cd6b40b1d4ac306eadc0" }, { "ImportPath": "k8s.io/client-go/listers/extensions/v1beta1", - "Rev": "59c2a8cb4f132af26d4d8d3c2fc91605e43d17cd" + "Rev": "21ef9faa5ba9ffe9e2c8cd6b40b1d4ac306eadc0" }, { "ImportPath": "k8s.io/client-go/listers/networking/v1", - "Rev": "59c2a8cb4f132af26d4d8d3c2fc91605e43d17cd" + "Rev": "21ef9faa5ba9ffe9e2c8cd6b40b1d4ac306eadc0" }, { "ImportPath": "k8s.io/client-go/listers/policy/v1beta1", - "Rev": "59c2a8cb4f132af26d4d8d3c2fc91605e43d17cd" + "Rev": "21ef9faa5ba9ffe9e2c8cd6b40b1d4ac306eadc0" }, { "ImportPath": "k8s.io/client-go/listers/rbac/v1", - "Rev": "59c2a8cb4f132af26d4d8d3c2fc91605e43d17cd" + "Rev": "21ef9faa5ba9ffe9e2c8cd6b40b1d4ac306eadc0" }, { "ImportPath": "k8s.io/client-go/listers/rbac/v1alpha1", - "Rev": "59c2a8cb4f132af26d4d8d3c2fc91605e43d17cd" + "Rev": "21ef9faa5ba9ffe9e2c8cd6b40b1d4ac306eadc0" }, { "ImportPath": "k8s.io/client-go/listers/rbac/v1beta1", - "Rev": "59c2a8cb4f132af26d4d8d3c2fc91605e43d17cd" + "Rev": "21ef9faa5ba9ffe9e2c8cd6b40b1d4ac306eadc0" }, { "ImportPath": "k8s.io/client-go/listers/scheduling/v1alpha1", - "Rev": "59c2a8cb4f132af26d4d8d3c2fc91605e43d17cd" + "Rev": "21ef9faa5ba9ffe9e2c8cd6b40b1d4ac306eadc0" }, { "ImportPath": "k8s.io/client-go/listers/scheduling/v1beta1", - "Rev": "59c2a8cb4f132af26d4d8d3c2fc91605e43d17cd" + "Rev": "21ef9faa5ba9ffe9e2c8cd6b40b1d4ac306eadc0" }, { "ImportPath": "k8s.io/client-go/listers/settings/v1alpha1", - "Rev": "59c2a8cb4f132af26d4d8d3c2fc91605e43d17cd" + "Rev": "21ef9faa5ba9ffe9e2c8cd6b40b1d4ac306eadc0" }, { "ImportPath": "k8s.io/client-go/listers/storage/v1", - "Rev": "59c2a8cb4f132af26d4d8d3c2fc91605e43d17cd" + "Rev": "21ef9faa5ba9ffe9e2c8cd6b40b1d4ac306eadc0" }, { "ImportPath": "k8s.io/client-go/listers/storage/v1alpha1", - "Rev": "59c2a8cb4f132af26d4d8d3c2fc91605e43d17cd" + "Rev": "21ef9faa5ba9ffe9e2c8cd6b40b1d4ac306eadc0" }, { "ImportPath": "k8s.io/client-go/listers/storage/v1beta1", - "Rev": "59c2a8cb4f132af26d4d8d3c2fc91605e43d17cd" + "Rev": "21ef9faa5ba9ffe9e2c8cd6b40b1d4ac306eadc0" }, { "ImportPath": "k8s.io/client-go/pkg/apis/clientauthentication", - "Rev": "59c2a8cb4f132af26d4d8d3c2fc91605e43d17cd" + "Rev": "21ef9faa5ba9ffe9e2c8cd6b40b1d4ac306eadc0" }, { "ImportPath": "k8s.io/client-go/pkg/apis/clientauthentication/v1alpha1", - "Rev": "59c2a8cb4f132af26d4d8d3c2fc91605e43d17cd" + "Rev": "21ef9faa5ba9ffe9e2c8cd6b40b1d4ac306eadc0" }, { "ImportPath": "k8s.io/client-go/pkg/apis/clientauthentication/v1beta1", - "Rev": "59c2a8cb4f132af26d4d8d3c2fc91605e43d17cd" + "Rev": "21ef9faa5ba9ffe9e2c8cd6b40b1d4ac306eadc0" }, { "ImportPath": "k8s.io/client-go/pkg/version", - "Rev": "59c2a8cb4f132af26d4d8d3c2fc91605e43d17cd" + "Rev": "21ef9faa5ba9ffe9e2c8cd6b40b1d4ac306eadc0" }, { "ImportPath": "k8s.io/client-go/plugin/pkg/client/auth/exec", - "Rev": "59c2a8cb4f132af26d4d8d3c2fc91605e43d17cd" + "Rev": "21ef9faa5ba9ffe9e2c8cd6b40b1d4ac306eadc0" }, { "ImportPath": "k8s.io/client-go/rest", - "Rev": "59c2a8cb4f132af26d4d8d3c2fc91605e43d17cd" + "Rev": "21ef9faa5ba9ffe9e2c8cd6b40b1d4ac306eadc0" }, { "ImportPath": "k8s.io/client-go/rest/watch", - "Rev": "59c2a8cb4f132af26d4d8d3c2fc91605e43d17cd" + "Rev": "21ef9faa5ba9ffe9e2c8cd6b40b1d4ac306eadc0" }, { "ImportPath": "k8s.io/client-go/restmapper", - "Rev": "59c2a8cb4f132af26d4d8d3c2fc91605e43d17cd" + "Rev": "21ef9faa5ba9ffe9e2c8cd6b40b1d4ac306eadc0" }, { "ImportPath": "k8s.io/client-go/scale", - "Rev": "59c2a8cb4f132af26d4d8d3c2fc91605e43d17cd" + "Rev": "21ef9faa5ba9ffe9e2c8cd6b40b1d4ac306eadc0" }, { "ImportPath": "k8s.io/client-go/scale/scheme", - "Rev": "59c2a8cb4f132af26d4d8d3c2fc91605e43d17cd" + "Rev": "21ef9faa5ba9ffe9e2c8cd6b40b1d4ac306eadc0" }, { "ImportPath": "k8s.io/client-go/scale/scheme/appsint", - "Rev": "59c2a8cb4f132af26d4d8d3c2fc91605e43d17cd" + "Rev": "21ef9faa5ba9ffe9e2c8cd6b40b1d4ac306eadc0" }, { "ImportPath": "k8s.io/client-go/scale/scheme/appsv1beta1", - "Rev": "59c2a8cb4f132af26d4d8d3c2fc91605e43d17cd" + "Rev": "21ef9faa5ba9ffe9e2c8cd6b40b1d4ac306eadc0" }, { "ImportPath": "k8s.io/client-go/scale/scheme/appsv1beta2", - "Rev": "59c2a8cb4f132af26d4d8d3c2fc91605e43d17cd" + "Rev": "21ef9faa5ba9ffe9e2c8cd6b40b1d4ac306eadc0" }, { "ImportPath": "k8s.io/client-go/scale/scheme/autoscalingv1", - "Rev": "59c2a8cb4f132af26d4d8d3c2fc91605e43d17cd" + "Rev": "21ef9faa5ba9ffe9e2c8cd6b40b1d4ac306eadc0" }, { "ImportPath": "k8s.io/client-go/scale/scheme/extensionsint", - "Rev": "59c2a8cb4f132af26d4d8d3c2fc91605e43d17cd" + "Rev": "21ef9faa5ba9ffe9e2c8cd6b40b1d4ac306eadc0" }, { "ImportPath": "k8s.io/client-go/scale/scheme/extensionsv1beta1", - "Rev": "59c2a8cb4f132af26d4d8d3c2fc91605e43d17cd" + "Rev": "21ef9faa5ba9ffe9e2c8cd6b40b1d4ac306eadc0" }, { "ImportPath": "k8s.io/client-go/testing", - "Rev": "59c2a8cb4f132af26d4d8d3c2fc91605e43d17cd" + "Rev": "21ef9faa5ba9ffe9e2c8cd6b40b1d4ac306eadc0" }, { "ImportPath": "k8s.io/client-go/third_party/forked/golang/template", - "Rev": "59c2a8cb4f132af26d4d8d3c2fc91605e43d17cd" + "Rev": "21ef9faa5ba9ffe9e2c8cd6b40b1d4ac306eadc0" }, { "ImportPath": "k8s.io/client-go/tools/auth", - "Rev": "59c2a8cb4f132af26d4d8d3c2fc91605e43d17cd" + "Rev": "21ef9faa5ba9ffe9e2c8cd6b40b1d4ac306eadc0" }, { "ImportPath": "k8s.io/client-go/tools/cache", - "Rev": "59c2a8cb4f132af26d4d8d3c2fc91605e43d17cd" + "Rev": "21ef9faa5ba9ffe9e2c8cd6b40b1d4ac306eadc0" }, { "ImportPath": "k8s.io/client-go/tools/clientcmd", - "Rev": "59c2a8cb4f132af26d4d8d3c2fc91605e43d17cd" + "Rev": "21ef9faa5ba9ffe9e2c8cd6b40b1d4ac306eadc0" }, { "ImportPath": "k8s.io/client-go/tools/clientcmd/api", - "Rev": "59c2a8cb4f132af26d4d8d3c2fc91605e43d17cd" + "Rev": "21ef9faa5ba9ffe9e2c8cd6b40b1d4ac306eadc0" }, { "ImportPath": "k8s.io/client-go/tools/clientcmd/api/latest", - "Rev": "59c2a8cb4f132af26d4d8d3c2fc91605e43d17cd" + "Rev": "21ef9faa5ba9ffe9e2c8cd6b40b1d4ac306eadc0" }, { "ImportPath": "k8s.io/client-go/tools/clientcmd/api/v1", - "Rev": "59c2a8cb4f132af26d4d8d3c2fc91605e43d17cd" + "Rev": "21ef9faa5ba9ffe9e2c8cd6b40b1d4ac306eadc0" }, { "ImportPath": "k8s.io/client-go/tools/leaderelection", - "Rev": "59c2a8cb4f132af26d4d8d3c2fc91605e43d17cd" + "Rev": "21ef9faa5ba9ffe9e2c8cd6b40b1d4ac306eadc0" }, { "ImportPath": "k8s.io/client-go/tools/leaderelection/resourcelock", - "Rev": "59c2a8cb4f132af26d4d8d3c2fc91605e43d17cd" + "Rev": "21ef9faa5ba9ffe9e2c8cd6b40b1d4ac306eadc0" }, { "ImportPath": "k8s.io/client-go/tools/metrics", - "Rev": "59c2a8cb4f132af26d4d8d3c2fc91605e43d17cd" + "Rev": "21ef9faa5ba9ffe9e2c8cd6b40b1d4ac306eadc0" }, { "ImportPath": "k8s.io/client-go/tools/pager", - "Rev": "59c2a8cb4f132af26d4d8d3c2fc91605e43d17cd" + "Rev": "21ef9faa5ba9ffe9e2c8cd6b40b1d4ac306eadc0" }, { "ImportPath": "k8s.io/client-go/tools/record", - "Rev": "59c2a8cb4f132af26d4d8d3c2fc91605e43d17cd" + "Rev": "21ef9faa5ba9ffe9e2c8cd6b40b1d4ac306eadc0" }, { "ImportPath": "k8s.io/client-go/tools/reference", - "Rev": "59c2a8cb4f132af26d4d8d3c2fc91605e43d17cd" + "Rev": "21ef9faa5ba9ffe9e2c8cd6b40b1d4ac306eadc0" }, { "ImportPath": "k8s.io/client-go/tools/remotecommand", - "Rev": "59c2a8cb4f132af26d4d8d3c2fc91605e43d17cd" + "Rev": "21ef9faa5ba9ffe9e2c8cd6b40b1d4ac306eadc0" }, { "ImportPath": "k8s.io/client-go/tools/watch", - "Rev": "59c2a8cb4f132af26d4d8d3c2fc91605e43d17cd" + "Rev": "21ef9faa5ba9ffe9e2c8cd6b40b1d4ac306eadc0" }, { "ImportPath": "k8s.io/client-go/transport", - "Rev": "59c2a8cb4f132af26d4d8d3c2fc91605e43d17cd" + "Rev": "21ef9faa5ba9ffe9e2c8cd6b40b1d4ac306eadc0" }, { "ImportPath": "k8s.io/client-go/transport/spdy", - "Rev": "59c2a8cb4f132af26d4d8d3c2fc91605e43d17cd" + "Rev": "21ef9faa5ba9ffe9e2c8cd6b40b1d4ac306eadc0" }, { "ImportPath": "k8s.io/client-go/util/buffer", - "Rev": "59c2a8cb4f132af26d4d8d3c2fc91605e43d17cd" + "Rev": "21ef9faa5ba9ffe9e2c8cd6b40b1d4ac306eadc0" }, { "ImportPath": "k8s.io/client-go/util/cert", - "Rev": "59c2a8cb4f132af26d4d8d3c2fc91605e43d17cd" + "Rev": "21ef9faa5ba9ffe9e2c8cd6b40b1d4ac306eadc0" }, { "ImportPath": "k8s.io/client-go/util/certificate", - "Rev": "59c2a8cb4f132af26d4d8d3c2fc91605e43d17cd" + "Rev": "21ef9faa5ba9ffe9e2c8cd6b40b1d4ac306eadc0" }, { "ImportPath": "k8s.io/client-go/util/certificate/csr", - "Rev": "59c2a8cb4f132af26d4d8d3c2fc91605e43d17cd" + "Rev": "21ef9faa5ba9ffe9e2c8cd6b40b1d4ac306eadc0" }, { "ImportPath": "k8s.io/client-go/util/connrotation", - "Rev": "59c2a8cb4f132af26d4d8d3c2fc91605e43d17cd" + "Rev": "21ef9faa5ba9ffe9e2c8cd6b40b1d4ac306eadc0" }, { "ImportPath": "k8s.io/client-go/util/exec", - "Rev": "59c2a8cb4f132af26d4d8d3c2fc91605e43d17cd" + "Rev": "21ef9faa5ba9ffe9e2c8cd6b40b1d4ac306eadc0" }, { "ImportPath": "k8s.io/client-go/util/flowcontrol", - "Rev": "59c2a8cb4f132af26d4d8d3c2fc91605e43d17cd" + "Rev": "21ef9faa5ba9ffe9e2c8cd6b40b1d4ac306eadc0" }, { "ImportPath": "k8s.io/client-go/util/homedir", - "Rev": "59c2a8cb4f132af26d4d8d3c2fc91605e43d17cd" + "Rev": "21ef9faa5ba9ffe9e2c8cd6b40b1d4ac306eadc0" }, { "ImportPath": "k8s.io/client-go/util/integer", - "Rev": "59c2a8cb4f132af26d4d8d3c2fc91605e43d17cd" + "Rev": "21ef9faa5ba9ffe9e2c8cd6b40b1d4ac306eadc0" }, { "ImportPath": "k8s.io/client-go/util/jsonpath", - "Rev": "59c2a8cb4f132af26d4d8d3c2fc91605e43d17cd" + "Rev": "21ef9faa5ba9ffe9e2c8cd6b40b1d4ac306eadc0" }, { "ImportPath": "k8s.io/client-go/util/retry", - "Rev": "59c2a8cb4f132af26d4d8d3c2fc91605e43d17cd" + "Rev": "21ef9faa5ba9ffe9e2c8cd6b40b1d4ac306eadc0" }, { "ImportPath": "k8s.io/client-go/util/workqueue", - "Rev": "59c2a8cb4f132af26d4d8d3c2fc91605e43d17cd" + "Rev": "21ef9faa5ba9ffe9e2c8cd6b40b1d4ac306eadc0" }, { "ImportPath": "k8s.io/cloud-provider", - "Rev": "f3ef4ee6f521520a216bd57c3f9a349ca71fff74" + "Rev": "9cadaea8457db95b46367f564cc8fa22879f8ea2" }, { "ImportPath": "k8s.io/csi-api/pkg/apis/csi/v1alpha1", - "Rev": "e425feb6162ff484236f5b7eab79d207e5047513" + "Rev": "ceded49ae99a26bcc10b2763ce5716a602dcd954" }, { "ImportPath": "k8s.io/csi-api/pkg/client/clientset/versioned", - "Rev": "e425feb6162ff484236f5b7eab79d207e5047513" + "Rev": "ceded49ae99a26bcc10b2763ce5716a602dcd954" }, { "ImportPath": "k8s.io/csi-api/pkg/client/clientset/versioned/scheme", - "Rev": "e425feb6162ff484236f5b7eab79d207e5047513" + "Rev": "ceded49ae99a26bcc10b2763ce5716a602dcd954" }, { "ImportPath": "k8s.io/csi-api/pkg/client/clientset/versioned/typed/csi/v1alpha1", - "Rev": "e425feb6162ff484236f5b7eab79d207e5047513" + "Rev": "ceded49ae99a26bcc10b2763ce5716a602dcd954" }, { "ImportPath": "k8s.io/csi-api/pkg/client/informers/externalversions", - "Rev": "e425feb6162ff484236f5b7eab79d207e5047513" + "Rev": "ceded49ae99a26bcc10b2763ce5716a602dcd954" }, { "ImportPath": "k8s.io/csi-api/pkg/client/informers/externalversions/csi", - "Rev": "e425feb6162ff484236f5b7eab79d207e5047513" + "Rev": "ceded49ae99a26bcc10b2763ce5716a602dcd954" }, { "ImportPath": "k8s.io/csi-api/pkg/client/informers/externalversions/csi/v1alpha1", - "Rev": "e425feb6162ff484236f5b7eab79d207e5047513" + "Rev": "ceded49ae99a26bcc10b2763ce5716a602dcd954" }, { "ImportPath": "k8s.io/csi-api/pkg/client/informers/externalversions/internalinterfaces", - "Rev": "e425feb6162ff484236f5b7eab79d207e5047513" + "Rev": "ceded49ae99a26bcc10b2763ce5716a602dcd954" }, { "ImportPath": "k8s.io/csi-api/pkg/client/listers/csi/v1alpha1", - "Rev": "e425feb6162ff484236f5b7eab79d207e5047513" + "Rev": "ceded49ae99a26bcc10b2763ce5716a602dcd954" }, { "ImportPath": "k8s.io/klog", @@ -3616,1991 +3625,1991 @@ }, { "ImportPath": "k8s.io/kube-proxy/config/v1alpha1", - "Rev": "d788cd669db2b4318e07df390476c345abfd3f51" + "Rev": "51590f6f600b19ba2534f5d6e415a600654084d2" }, { "ImportPath": "k8s.io/kubelet/config/v1beta1", - "Rev": "67362483bec9a8a41228f3e6f825e24959b4625d" + "Rev": "33f1c54199e185a6fbf1af4deae776f454298b13" }, { "ImportPath": "k8s.io/kubernetes/cmd/kube-proxy/app", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/cmd/kubelet/app", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/cmd/kubelet/app/options", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/api/legacyscheme", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/api/ref", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/api/service", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/api/testapi", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/api/v1/pod", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/api/v1/resource", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/api/v1/service", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/apis/admission", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/apis/admission/install", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/apis/admission/v1beta1", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/apis/admissionregistration", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/apis/admissionregistration/install", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/apis/admissionregistration/v1alpha1", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/apis/admissionregistration/v1beta1", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/apis/apps", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/apis/apps/install", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/apis/apps/v1", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/apis/apps/v1beta1", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/apis/apps/v1beta2", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/apis/apps/validation", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/apis/auditregistration", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/apis/auditregistration/install", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/apis/auditregistration/v1alpha1", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/apis/authentication", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/apis/authentication/install", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/apis/authentication/v1", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/apis/authentication/v1beta1", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/apis/authorization", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/apis/authorization/install", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/apis/authorization/v1", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/apis/authorization/v1beta1", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/apis/autoscaling", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/apis/autoscaling/install", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/apis/autoscaling/v1", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/apis/autoscaling/v2beta1", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/apis/autoscaling/v2beta2", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/apis/batch", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/apis/batch/install", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/apis/batch/v1", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/apis/batch/v1beta1", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/apis/batch/v2alpha1", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/apis/certificates", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/apis/certificates/install", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/apis/certificates/v1beta1", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/apis/coordination", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/apis/coordination/install", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/apis/coordination/v1beta1", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/apis/core", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/apis/core/helper", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/apis/core/install", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/apis/core/pods", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/apis/core/v1", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/apis/core/v1/helper", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/apis/core/v1/helper/qos", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/apis/core/v1/validation", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/apis/core/validation", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/apis/events", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/apis/events/install", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/apis/events/v1beta1", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/apis/extensions", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/apis/extensions/install", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/apis/extensions/v1beta1", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/apis/imagepolicy", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/apis/imagepolicy/install", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/apis/imagepolicy/v1alpha1", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/apis/networking", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/apis/networking/install", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/apis/networking/v1", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/apis/policy", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/apis/policy/install", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/apis/policy/v1beta1", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/apis/policy/validation", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/apis/rbac", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/apis/rbac/install", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/apis/rbac/v1", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/apis/rbac/v1alpha1", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/apis/rbac/v1beta1", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/apis/scheduling", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/apis/scheduling/install", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/apis/scheduling/v1alpha1", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/apis/scheduling/v1beta1", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/apis/settings", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/apis/settings/install", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/apis/settings/v1alpha1", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/apis/storage", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/apis/storage/install", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/apis/storage/v1", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/apis/storage/v1alpha1", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/apis/storage/v1beta1", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/capabilities", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/scheme", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/typed/admissionregistration/internalversion", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/typed/apps/internalversion", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/typed/auditregistration/internalversion", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/typed/authentication/internalversion", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/typed/authorization/internalversion", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/typed/autoscaling/internalversion", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/typed/batch/internalversion", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/typed/certificates/internalversion", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/typed/coordination/internalversion", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/typed/core/internalversion", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/typed/events/internalversion", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/typed/extensions/internalversion", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/typed/networking/internalversion", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/typed/policy/internalversion", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/typed/rbac/internalversion", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/typed/scheduling/internalversion", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/typed/settings/internalversion", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/typed/storage/internalversion", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/client/leaderelectionconfig", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/client/metrics/prometheus", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/cloudprovider/providers", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/cloudprovider/providers/aws", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/cloudprovider/providers/azure", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/cloudprovider/providers/azure/auth", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/cloudprovider/providers/cloudstack", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/cloudprovider/providers/gce", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/cloudprovider/providers/gce/cloud", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/cloudprovider/providers/gce/cloud/filter", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/cloudprovider/providers/gce/cloud/meta", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/cloudprovider/providers/gce/cloud/mock", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/cloudprovider/providers/openstack", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/cloudprovider/providers/ovirt", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/cloudprovider/providers/photon", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/cloudprovider/providers/vsphere", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/cloudprovider/providers/vsphere/vclib", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/cloudprovider/providers/vsphere/vclib/diskmanagers", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/controller", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/controller/deployment/util", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/controller/volume/events", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/controller/volume/expand/cache", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/controller/volume/persistentvolume", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/controller/volume/persistentvolume/metrics", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/credentialprovider", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/credentialprovider/aws", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/credentialprovider/azure", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/credentialprovider/gcp", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/credentialprovider/rancher", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/credentialprovider/secrets", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/features", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/fieldpath", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/kubectl", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/kubectl/apps", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/kubectl/describe", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/kubectl/describe/versioned", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/kubectl/scheme", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/kubectl/util", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/kubectl/util/certificate", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/kubectl/util/deployment", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/kubectl/util/event", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/kubectl/util/fieldpath", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/kubectl/util/podutils", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/kubectl/util/qos", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/kubectl/util/rbac", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/kubectl/util/resource", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/kubectl/util/slice", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/kubectl/util/storage", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/kubelet", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/kubelet/apis", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/kubelet/apis/config", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/kubelet/apis/config/scheme", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/kubelet/apis/config/v1beta1", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/kubelet/apis/config/validation", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/kubelet/apis/cri", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/kubelet/apis/cri/runtime/v1alpha2", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/kubelet/apis/deviceplugin/v1beta1", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/kubelet/apis/pluginregistration/v1", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/kubelet/apis/podresources", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/kubelet/apis/podresources/v1alpha1", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/kubelet/apis/stats/v1alpha1", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/kubelet/cadvisor", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/kubelet/certificate", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/kubelet/certificate/bootstrap", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/kubelet/checkpoint", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/kubelet/checkpointmanager", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/kubelet/checkpointmanager/checksum", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/kubelet/checkpointmanager/errors", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/kubelet/cloudresource", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/kubelet/cm", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/kubelet/cm/cpumanager", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/kubelet/cm/cpumanager/state", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/kubelet/cm/cpumanager/topology", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/kubelet/cm/cpuset", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/kubelet/cm/devicemanager", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/kubelet/cm/devicemanager/checkpoint", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/kubelet/cm/util", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/kubelet/config", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/kubelet/configmap", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/kubelet/container", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/kubelet/container/testing", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/kubelet/dockershim", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/kubelet/dockershim/cm", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/kubelet/dockershim/libdocker", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/kubelet/dockershim/metrics", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/kubelet/dockershim/network", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/kubelet/dockershim/network/cni", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/kubelet/dockershim/network/hostport", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/kubelet/dockershim/network/kubenet", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/kubelet/dockershim/network/metrics", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/kubelet/dockershim/remote", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/kubelet/envvars", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/kubelet/events", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/kubelet/eviction", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/kubelet/eviction/api", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/kubelet/images", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/kubelet/kubeletconfig", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/kubelet/kubeletconfig/checkpoint", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/kubelet/kubeletconfig/checkpoint/store", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/kubelet/kubeletconfig/configfiles", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/kubelet/kubeletconfig/status", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/kubelet/kubeletconfig/util/codec", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/kubelet/kubeletconfig/util/files", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/kubelet/kubeletconfig/util/log", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/kubelet/kubeletconfig/util/panic", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/kubelet/kuberuntime", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/kubelet/kuberuntime/logs", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/kubelet/leaky", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/kubelet/lifecycle", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/kubelet/logs", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/kubelet/metrics", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/kubelet/metrics/collectors", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/kubelet/mountpod", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/kubelet/network/dns", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/kubelet/nodelease", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/kubelet/nodestatus", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/kubelet/pleg", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/kubelet/pod", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/kubelet/preemption", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/kubelet/prober", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/kubelet/prober/results", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/kubelet/qos", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/kubelet/remote", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/kubelet/runtimeclass", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/kubelet/secret", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/kubelet/server", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/kubelet/server/portforward", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/kubelet/server/remotecommand", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/kubelet/server/stats", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/kubelet/server/streaming", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/kubelet/stats", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/kubelet/status", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/kubelet/sysctl", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/kubelet/token", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/kubelet/types", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/kubelet/util", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/kubelet/util/cache", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/kubelet/util/format", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/kubelet/util/ioutils", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/kubelet/util/manager", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/kubelet/util/pluginwatcher", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/kubelet/util/pluginwatcher/example_plugin_apis/v1beta1", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/kubelet/util/pluginwatcher/example_plugin_apis/v1beta2", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/kubelet/util/queue", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/kubelet/util/sliceutils", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/kubelet/util/store", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/kubelet/volumemanager", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/kubelet/volumemanager/cache", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/kubelet/volumemanager/metrics", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/kubelet/volumemanager/populator", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/kubelet/volumemanager/reconciler", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/kubelet/winstats", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/kubemark", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/master/ports", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/probe", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/probe/exec", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/probe/http", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/probe/tcp", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/proxy", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/proxy/apis/config", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/proxy/apis/config/scheme", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/proxy/apis/config/v1alpha1", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/proxy/apis/config/validation", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/proxy/config", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/proxy/healthcheck", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/proxy/iptables", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/proxy/ipvs", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/proxy/metrics", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/proxy/userspace", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/proxy/util", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/proxy/winkernel", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/proxy/winuserspace", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/quota/v1", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/scheduler/algorithm", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/scheduler/algorithm/predicates", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/scheduler/algorithm/priorities", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/scheduler/algorithm/priorities/util", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/scheduler/algorithmprovider", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/scheduler/algorithmprovider/defaults", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/scheduler/api", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/scheduler/api/validation", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/scheduler/cache", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/scheduler/core", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/scheduler/core/equivalence", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/scheduler/factory", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/scheduler/internal/cache", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/scheduler/internal/cache/debugger", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/scheduler/internal/queue", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/scheduler/metrics", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/scheduler/util", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/scheduler/volumebinder", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/security/apparmor", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/security/podsecuritypolicy/seccomp", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/security/podsecuritypolicy/sysctl", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/security/podsecuritypolicy/util", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/securitycontext", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/serviceaccount", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/util/async", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/util/bandwidth", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/util/config", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/util/configz", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/util/conntrack", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/util/dbus", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/util/ebtables", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/util/env", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/util/file", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/util/filesystem", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/util/flag", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/util/flock", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/util/goroutinemap", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/util/goroutinemap/exponentialbackoff", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/util/hash", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/util/io", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/util/ipconfig", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/util/ipset", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/util/iptables", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/util/ipvs", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/util/keymutex", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/util/labels", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/util/mount", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/util/net", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/util/net/sets", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/util/netsh", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/util/node", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/util/nsenter", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/util/oom", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/util/parsers", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/util/pod", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/util/procfs", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/util/removeall", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/util/resizefs", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/util/resourcecontainer", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/util/rlimit", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/util/selinux", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/util/slice", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/util/strings", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/util/sysctl", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/util/tail", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/util/taints", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/version", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/version/verflag", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/volume", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/volume/awsebs", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/volume/azure_dd", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/volume/azure_file", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/volume/cephfs", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/volume/cinder", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/volume/configmap", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/volume/csi", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/volume/csi/csiv0", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/volume/csi/nodeinfomanager", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/volume/downwardapi", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/volume/emptydir", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/volume/fc", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/volume/flexvolume", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/volume/flocker", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/volume/gcepd", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/volume/git_repo", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/volume/glusterfs", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/volume/host_path", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/volume/iscsi", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/volume/local", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/volume/nfs", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/volume/photon_pd", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/volume/portworx", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/volume/projected", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/volume/quobyte", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/volume/rbd", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/volume/scaleio", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/volume/secret", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/volume/storageos", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/volume/util", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/volume/util/fs", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/volume/util/nestedpendingoperations", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/volume/util/operationexecutor", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/volume/util/recyclerclient", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/volume/util/types", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/volume/util/volumepathhandler", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/volume/validation", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/volume/vsphere_volume", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/pkg/windows/service", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/test/utils", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/kubernetes/third_party/forked/golang/expansion", - "Comment": "v1.14.0-alpha.0-575-gf8ac78b3cb", - "Rev": "f8ac78b3cb11c940c301be5aa5de419c036e9ce3" + "Comment": "v1.13.2-1-gd48387cc4c", + "Rev": "d48387cc4ca85d2af0c27602f466d750686f2b28" }, { "ImportPath": "k8s.io/utils/clock", diff --git a/cluster-autoscaler/cloudprovider/aws/api/UPDATE_TEST_DATA.md b/cluster-autoscaler/cloudprovider/aws/api/UPDATE_TEST_DATA.md new file mode 100644 index 000000000000..a5098f8923e3 --- /dev/null +++ b/cluster-autoscaler/cloudprovider/aws/api/UPDATE_TEST_DATA.md @@ -0,0 +1,23 @@ +Update AWS test data +===== + +Install AWS CLI Tools + +Update + +```bash +cd ${GOPATH}/src/k8s.io/autoscaler + +# update on demand data +aws pricing get-products \ + --region=us-east-1 \ + --service-code=AmazonEC2 \ + --filter Type=TERM_MATCH,Field=capacitystatus,Value=Used \ + Type=TERM_MATCH,Field=preInstalledSw,Value=NA \ + Type=TERM_MATCH,Field=location,Value="EU (Ireland)" \ + Type=TERM_MATCH,Field=instanceType,Value="m4.xlarge" \ + > ./cluster-autoscaler/cloudprovider/aws/api/pricing_ondemand_eu-west-1.json + +# update spot data + +``` \ No newline at end of file diff --git a/cluster-autoscaler/cloudprovider/aws/api/instance_info.go b/cluster-autoscaler/cloudprovider/aws/api/instance_info.go index 68d2e8ecf7b4..259e3d81840e 100644 --- a/cluster-autoscaler/cloudprovider/aws/api/instance_info.go +++ b/cluster-autoscaler/cloudprovider/aws/api/instance_info.go @@ -19,7 +19,6 @@ package api import ( "encoding/json" "fmt" - "io/ioutil" "net/http" "regexp" "strconv" @@ -27,7 +26,11 @@ import ( "sync" "time" - "github.com/golang/glog" + "github.com/aws/aws-sdk-go/aws" + "github.com/aws/aws-sdk-go/private/protocol" + "github.com/aws/aws-sdk-go/service/pricing" + "github.com/pkg/errors" + "k8s.io/klog" ) const ( @@ -37,6 +40,33 @@ const ( instanceTenancyShared = "Shared" ) +// TODO find some API for this map - support case opened +var ( + regionNameMap = map[string]string{ + "us-east-2": "USA East (Ohio)", + "us-east-1": "USA East (N. Virginia)", + "us-west-1": "USA West (N. California)", + "us-west-2": "USA West (Oregon)", + "ap-south-1": "Asia Pacific (Mumbai)", + "ap-northeast-3": "Asia Pacific (Osaka-Local)", + "ap-northeast-2": "Asia Pacific (Seoul)", + "ap-southeast-1": "Asia Pacific (Singapore)", + "ap-southeast-2": "Asia Pacific (Sydney)", + "ap-northeast-1": "Asia Pacific (Tokyo)", + "ca-central-1": "Canada (Central)", + "cn-north-1": "China (Beijing)", + "cn-northwest-1": "China (Ningxia)", + "eu-central-1": "EU (Frankfurt)", + "eu-west-1": "EU (Ireland)", + "eu-west-2": "EU (London)", + "eu-west-3": "EU (Paris)", + "eu-north-1": "EU (Stockholm)", + "sa-east-1": "South America (São Paulo)", + "us-gov-east-1": "AWS GovCloud (US-East)", + "us-gov-west-1": "AWS GovCloud (USA)", + } +) + // InstanceInfo holds AWS EC2 instance information type InstanceInfo struct { // InstanceType of the described instance @@ -51,12 +81,12 @@ type InstanceInfo struct { GPU int64 } -type httpClient interface { - Do(req *http.Request) (*http.Response, error) +type awsClient interface { + GetProducts(input *pricing.GetProductsInput) (*pricing.GetProductsOutput, error) } // NewEC2InstanceInfoService is the constructor of instanceInfoService which is a wrapper for AWS Pricing API. -func NewEC2InstanceInfoService(client httpClient) *instanceInfoService { +func NewEC2InstanceInfoService(client awsClient) *instanceInfoService { return &instanceInfoService{ client: client, cache: make(instanceInfoCache), @@ -64,32 +94,32 @@ func NewEC2InstanceInfoService(client httpClient) *instanceInfoService { } type instanceInfoService struct { - client httpClient + client awsClient cache instanceInfoCache sync.RWMutex } // DescribeInstanceInfo returns the corresponding aws instance info by given instance type and availability zone. -func (s *instanceInfoService) DescribeInstanceInfo(instanceType string, availabilityZone string) (*InstanceInfo, error) { - if s.shouldSync(availabilityZone) { - if err := s.sync(availabilityZone); err != nil { +func (s *instanceInfoService) DescribeInstanceInfo(instanceType string, region string) (*InstanceInfo, error) { + if s.shouldSync(region) { + if err := s.sync(region); err != nil { // TODO may this be tolerated for resilience return nil, fmt.Errorf("failed to sync aws product and price information: %v", err) } } - if bucket, found := s.cache[availabilityZone]; found { + if bucket, found := s.cache[region]; found { for _, info := range bucket.info { if info.InstanceType == instanceType { return &info, nil } } } - return nil, fmt.Errorf("instance info not available for instance type %s in zone %s", instanceType, availabilityZone) + return nil, fmt.Errorf("instance info not available for instance type %s region %s", instanceType, region) } -func (s *instanceInfoService) shouldSync(availabilityZone string) bool { - bucket, found := s.cache[availabilityZone] +func (s *instanceInfoService) shouldSync(region string) bool { + bucket, found := s.cache[region] if !found { return true } @@ -97,25 +127,25 @@ func (s *instanceInfoService) shouldSync(availabilityZone string) bool { return bucket.LastSync().Before(time.Now().Truncate(instanceInfoCacheMaxAge)) } -func (s *instanceInfoService) sync(availabilityZone string) error { +func (s *instanceInfoService) sync(region string) error { s.Lock() defer s.Unlock() start := time.Now() - bucket, found := s.cache[availabilityZone] + bucket, found := s.cache[region] if !found { bucket = new(regionalInstanceInfoBucket) - s.cache[availabilityZone] = bucket + s.cache[region] = bucket } - response, err := s.fetch(availabilityZone, bucket.ETag) + response, err := s.fetch(region, bucket.ETag) if err != nil { return err } defer func() { - glog.V(4).Infof("Synchronized aws ec2 instance information for availability zone %s - took %s", availabilityZone, time.Now().Sub(start).String()) + klog.V(4).Infof("Synchronized aws ec2 instance information for region %s - took %s", region, time.Now().Sub(start).String()) }() if response == nil { @@ -152,22 +182,22 @@ func (s *instanceInfoService) sync(availabilityZone string) error { var err error if attr.Memory != "" && attr.Memory != "NA" { if i.MemoryMb, err = parseMemory(attr.Memory); err != nil { - return fmt.Errorf("parser error %v", err) + return errors.Wrapf(err, "error parsing memory for SKU %s [%s]", sku, attr.Memory) } } if attr.VCPU != "" { if i.VCPU, err = parseCPU(attr.VCPU); err != nil { - return fmt.Errorf("parser error %v", err) + return errors.Wrapf(err, "error parsing VCPU for SKU %s [%s]", sku, attr.VCPU) } } if attr.GPU != "" { if i.GPU, err = parseCPU(attr.GPU); err != nil { - return fmt.Errorf("parser error %v", err) + return errors.Wrapf(err, "error parsing GPU for SKU %s [%s]", sku, attr.GPU) } } - for priceSKU, offers := range response.Terms.OnDemand { + for priceSKU, offer := range response.Terms.OnDemand { if priceSKU != sku { continue } @@ -175,28 +205,26 @@ func (s *instanceInfoService) sync(availabilityZone string) error { var lastOfferTime time.Time var lastOfferPrice float64 - for _, offer := range offers { - if offer.EffectiveDate.After(now) { + if offer.EffectiveDate.After(now) { + continue + } + + for _, price := range offer.PriceDimensions { + if price.EndRange != "Inf" || price.Unit != "Hrs" { + continue + } + p, err := strconv.ParseFloat(price.PricePerUnit.USD, 64) + if err != nil { + return errors.Wrapf(err, "error parsing price for SKU %s [%s]", sku, price.PricePerUnit.USD) + } + + if p == 0.0 { continue } - for _, price := range offer.PriceDimensions { - if price.EndRange != "Inf" || price.Unit != "Hrs" { - continue - } - p, err := strconv.ParseFloat(price.PricePerUnit.USD, 64) - if err != nil { - return fmt.Errorf("error parsing price for SKU %s [%s] %v", sku, price.PricePerUnit.USD, err) - } - - if p == 0.0 { - continue - } - - if lastOfferTime.IsZero() || lastOfferTime.After(offer.EffectiveDate) { - lastOfferTime = offer.EffectiveDate - lastOfferPrice = p - } + if lastOfferTime.IsZero() || lastOfferTime.After(offer.EffectiveDate) { + lastOfferTime = offer.EffectiveDate + lastOfferPrice = p } } @@ -213,8 +241,12 @@ func (s *instanceInfoService) sync(availabilityZone string) error { return nil } -func (s *instanceInfoService) fetch(availabilityZone string, etag string) (*response, error) { - url := fmt.Sprintf(awsPricingAPIURLTemplate, availabilityZone) +func (s *instanceInfoService) fetch(region string, etag string) (*response, error) { + url := fmt.Sprintf(awsPricingAPIURLTemplate, region) + regionName, err := regionFullName(region) + if err != nil { + return nil, err + } req, err := http.NewRequest("GET", url, nil) @@ -222,29 +254,78 @@ func (s *instanceInfoService) fetch(availabilityZone string, etag string) (*resp req.Header.Add("If-None-Match", etag) } - res, err := s.client.Do(req) + input := &pricing.GetProductsInput{ + ServiceCode: aws.String("AmazonEC2"), + Filters: []*pricing.Filter{ + { + Type: aws.String("TERM_MATCH"), + Field: aws.String("location"), + Value: aws.String(regionName), + }, + { + Type: aws.String("TERM_MATCH"), + Field: aws.String("operatingSystem"), + Value: aws.String("Linux"), + }, + { + Type: aws.String("TERM_MATCH"), + Field: aws.String("capacitystatus"), + Value: aws.String("Used"), + }, + { + Type: aws.String("TERM_MATCH"), + Field: aws.String("tenancy"), + Value: aws.String("Shared"), + }, + { + Type: aws.String("TERM_MATCH"), + Field: aws.String("preInstalledSw"), + Value: aws.String("NA"), + }, + }, + } + + output, err := s.client.GetProducts(input) if err != nil { - return nil, fmt.Errorf("error fetching [%s]", url) + return nil, errors.Wrapf(err, "could not fetch products for region %s", region) } - defer res.Body.Close() + var data = new(response) + data.Products = make(map[string]product, 0) + data.Terms.OnDemand = make(map[string]productOffer, 0) - if res.StatusCode == 304 { - return nil, nil - } + for _, entry := range output.PriceList { + raw, err := protocol.EncodeJSONValue(entry, protocol.NoEscape) + if err != nil { + return nil, errors.Wrap(err, "could not encode back aws sdk pricing response") + } - var body []byte - if body, err = ioutil.ReadAll(res.Body); err != nil { - return nil, fmt.Errorf("error loading content of %s", url) - } + var entry = new(priceListEntry) + if err := json.Unmarshal([]byte(raw), entry); err != nil { + return nil, errors.Wrapf(err, "error unmarshaling pricing list entry: %s", raw) + } + + var validTerm productOffer + for _, term := range entry.Terms.OnDemand { + for _, priceDimension := range term.PriceDimensions { + if priceDimension.BeginRange == "0" && priceDimension.EndRange == "Inf" && !strings.HasPrefix(priceDimension.PricePerUnit.USD, "0.000000") { + validTerm = term + } + } + } + + if validTerm.SKU == "" { + klog.Warningf("no on demand price was not found for instance type %s in region %s", entry.Product.Attributes.InstanceType, region) + continue + } + + data.Products[entry.Product.SKU] = entry.Product + data.Terms.OnDemand[entry.Product.SKU] = validTerm - if res.StatusCode != 200 { - return nil, fmt.Errorf("got unexpected http status code %d with body [%s]", res.StatusCode, string(body)) } - var data = new(response) - if err := json.Unmarshal(body, data); err != nil { - return nil, fmt.Errorf("error unmarshaling %s with body [%s]", url, string(body)) + if len(data.Products) == 0 { + return nil, fmt.Errorf("no price information found for region %s", region) } return data, nil @@ -287,17 +368,20 @@ func (b *regionalInstanceInfoBucket) Add(info ...InstanceInfo) { b.info = append(b.info, info...) } +type priceListEntry struct { + Product product `json:"product"` + Terms terms `json:"terms"` +} + type response struct { Products map[string]product `json:"products"` Terms terms `json:"terms"` } type terms struct { - OnDemand map[string]productOffers `json:"OnDemand"` + OnDemand map[string]productOffer `json:"OnDemand"` } -type productOffers map[string]productOffer - type productOffer struct { OfferTermCode string `json:"offerTermCode"` EffectiveDate time.Time `json:"effectiveDate"` @@ -354,3 +438,11 @@ func parseCPU(cpu string) (int64, error) { } return i, nil } + +func regionFullName(region string) (string, error) { + if fullName, ok := regionNameMap[region]; ok { + return fullName, nil + } + + return "", errors.New(fmt.Sprintf("region full name not found for region: %s", region)) +} diff --git a/cluster-autoscaler/cloudprovider/aws/api/instance_info_test.go b/cluster-autoscaler/cloudprovider/aws/api/instance_info_test.go index ed90c918f3fa..b2abf6e61c8b 100644 --- a/cluster-autoscaler/cloudprovider/aws/api/instance_info_test.go +++ b/cluster-autoscaler/cloudprovider/aws/api/instance_info_test.go @@ -17,124 +17,135 @@ limitations under the License. package api import ( - "bytes" "fmt" - "io/ioutil" - "net/http" - "net/url" "os" "testing" + "reflect" + + "github.com/aws/aws-sdk-go/aws" + "github.com/aws/aws-sdk-go/private/protocol/json/jsonutil" + "github.com/aws/aws-sdk-go/service/pricing" "github.com/stretchr/testify/assert" ) -func loadMockData(t *testing.T) []byte { - var pricingBody []byte - f, err := os.Open("pricing_eu-west-1.json") +func loadMockData(t *testing.T) []aws.JSONValue { + f, err := os.Open("pricing_ondemand_eu-west-1.json") if err != nil { t.Fatalf("Failed to open mock file: %v", err) } - pricingBody, err = ioutil.ReadAll(f) + + grütze := &pricing.GetProductsOutput{} + + err = jsonutil.UnmarshalJSON(grütze, f) if err != nil { - t.Fatalf("Failed to load mock file: %v", err) + t.Fatalf("Failed transform mock JSON into AWS JSONValue: %v", err) } - return pricingBody + return grütze.PriceList } func TestInstanceInfoService_DescribeInstanceInfo(t *testing.T) { tcs := []struct { - name string - instanceType string - region string - expectError bool - expectOnDemandPrice float64 - expectCPU int64 + name string + instanceType string + region string + data []aws.JSONValue + errorExpected bool + expectedError string + expectedOnDemandPrice float64 + expectedCPU int64 }{ { - name: "good case: common case", - instanceType: "m4.xlarge", - region: "us-east-1", - expectError: false, - expectOnDemandPrice: 0.2, - expectCPU: 4, + name: "error case: unknown availability region", + instanceType: "m4.xlarge", + region: "unknown-region", + data: []aws.JSONValue{}, + errorExpected: true, + expectedError: "region full name not found for region: unknown-region", + expectedOnDemandPrice: 0, + expectedCPU: 0, }, { - name: "error case: unknown availability region", - instanceType: "m4.xlarge", - region: "eu-east-2", - expectError: true, - expectOnDemandPrice: 0, - expectCPU: 0, + name: "error case: invalid server response", + instanceType: "m4.xlarge", + region: "us-west-1", + data: []aws.JSONValue{}, + errorExpected: true, + expectedError: "failed to sync aws product and price information: no price information found for region us-west-1", + expectedOnDemandPrice: 0, + expectedCPU: 0, }, { - name: "error case: unknown instance", - instanceType: "unknown-instance", - region: "us-east-1", - expectError: true, - expectOnDemandPrice: 0, - expectCPU: 0, + name: "error case: unknown instance", + instanceType: "unknown-instance", + region: "eu-west-1", + data: loadMockData(t), + errorExpected: true, + expectedError: "instance info not available for instance type unknown-instance region eu-west-1", + expectedOnDemandPrice: 0, + expectedCPU: 0, }, { - name: "error case: invalid server response", - instanceType: "m4.xlarge", - region: "us-west-1", - expectError: true, - expectOnDemandPrice: 0, - expectCPU: 0, + name: "good case: common case", + instanceType: "m4.xlarge", + region: "eu-west-1", + data: loadMockData(t), + errorExpected: false, + expectedOnDemandPrice: 0.222, + expectedCPU: 4, }, } for _, tc := range tcs { t.Run(tc.name, func(t *testing.T) { - usEastOneURL, err := url.Parse(fmt.Sprintf(awsPricingAPIURLTemplate, "us-east-1")) - assert.NoError(t, err) - - usWestOneURL, err := url.Parse(fmt.Sprintf(awsPricingAPIURLTemplate, "us-west-1")) - assert.NoError(t, err) + indexRegion, err := regionFullName(tc.region) + if err != nil { + assert.Equal(t, err.Error(), tc.expectedError) + return + } - mc := &mockClient{m: make(map[string]mockResponse)} - mc.m[usEastOneURL.Path] = mockResponse{loadMockData(t), 200} - mc.m[usWestOneURL.Path] = mockResponse{[]byte("some non-json stuff"), 200} + mc := &mockClient{m: make(map[string][]aws.JSONValue)} + mc.m[indexRegion] = tc.data service := NewEC2InstanceInfoService(mc) info, err := service.DescribeInstanceInfo(tc.instanceType, tc.region) - if tc.expectError { + + if tc.errorExpected { assert.Error(t, err) + assert.Equal(t, tc.expectedError, err.Error()) } else { assert.NoError(t, err) assert.Equal(t, tc.instanceType, info.InstanceType) - assert.Equal(t, tc.expectCPU, info.VCPU) - assert.Equal(t, tc.expectOnDemandPrice, info.OnDemandPrice) + assert.Equal(t, tc.expectedCPU, info.VCPU) + assert.Equal(t, tc.expectedOnDemandPrice, info.OnDemandPrice) } }) } } -type mockResponse struct { - body []byte - statusCode int -} - type mockClient struct { - m map[string]mockResponse + m map[string][]aws.JSONValue } -func (m *mockClient) Do(req *http.Request) (*http.Response, error) { - if mock, found := m.m[req.URL.Path]; found { - return &http.Response{ - Status: http.StatusText(mock.statusCode), - StatusCode: mock.statusCode, - ContentLength: int64(len(mock.body)), - Body: ioutil.NopCloser(bytes.NewReader(mock.body)), - Request: req, +func (m *mockClient) GetProducts(input *pricing.GetProductsInput) (*pricing.GetProductsOutput, error) { + region := getRegionFromFilters(input.Filters) + + if mock, found := m.m[region]; found { + return &pricing.GetProductsOutput{ + PriceList: mock, }, nil } - return &http.Response{ - Status: http.StatusText(404), - StatusCode: 404, - Request: req, - Body: ioutil.NopCloser(bytes.NewReader([]byte{})), - ContentLength: 0, - }, nil + + return nil, fmt.Errorf("no price information found for region %s", region) +} + +func getRegionFromFilters(filters []*pricing.Filter) string { + for _, filter := range filters { + if reflect.DeepEqual(filter.Field, aws.String("location")) { + return aws.StringValue(filter.Value) + } + } + + return "no-region" } diff --git a/cluster-autoscaler/cloudprovider/aws/api/instance_spot_price_history.go b/cluster-autoscaler/cloudprovider/aws/api/instance_spot_price_history.go index bea05890f839..037e0fe90726 100644 --- a/cluster-autoscaler/cloudprovider/aws/api/instance_spot_price_history.go +++ b/cluster-autoscaler/cloudprovider/aws/api/instance_spot_price_history.go @@ -22,7 +22,7 @@ import ( "time" "github.com/aws/aws-sdk-go/aws" - "github.com/golang/glog" + "k8s.io/klog" "github.com/aws/aws-sdk-go/service/ec2" ) @@ -57,7 +57,7 @@ func (spd *spotPriceHistoryService) DescribeSpotPriceHistory(instanceType string req.SetProductDescriptions(aws.StringSlice([]string{"Linux/UNIX"})) if startTime.IsZero() { - glog.V(5).Info("initial history loading - retrieve only the last 10 prices") + klog.V(5).Info("initial history loading - retrieve only the last 10 prices") req.SetMaxResults(10) } else { req.SetStartTime(startTime) @@ -75,11 +75,11 @@ func (spd *spotPriceHistoryService) DescribeSpotPriceHistory(instanceType string req.NextToken = res.NextToken if req.NextToken == nil || len(*req.NextToken) == 0 { - glog.V(6).Info("breaking history loop after pagination record") + klog.V(6).Info("breaking history loop after pagination record") break } if startTime.IsZero() { - glog.V(6).Info("breaking history loop after retrieving last 10 prices") + klog.V(6).Info("breaking history loop after retrieving last 10 prices") break } } @@ -130,7 +130,7 @@ func convertSpotPriceItems(in ...*ec2.SpotPrice) SpotPriceItems { priceValue := aws.StringValue(item.SpotPrice) price, err := strconv.ParseFloat(priceValue, 64) if err != nil { - glog.Warningf("Failed to parse aws spot price '%s' to float: %v", priceValue, err) + klog.Warningf("Failed to parse aws spot price '%s' to float: %v", priceValue, err) continue } diff --git a/cluster-autoscaler/cloudprovider/aws/api/pricing_eu-west-1.json b/cluster-autoscaler/cloudprovider/aws/api/pricing_eu-west-1.json deleted file mode 100644 index b367797321de..000000000000 --- a/cluster-autoscaler/cloudprovider/aws/api/pricing_eu-west-1.json +++ /dev/null @@ -1,325 +0,0 @@ -{ - "formatVersion": "v1.0", - "disclaimer": "This pricing list is for informational purposes only. All prices are subject to the additional terms included in the pricing pages on http://aws.amazon.com. All Free Tier prices are also subject to the terms included at https://aws.amazon.com/free/", - "offerCode": "AmazonEC2", - "version": "20171117190039", - "publicationDate": "2017-11-17T19:00:39Z", - "products": { - "3UP33R2RXCADSPSX": { - "sku": "3UP33R2RXCADSPSX", - "productFamily": "Compute Instance", - "attributes": { - "servicecode": "AmazonEC2", - "location": "US East (N. Virginia)", - "locationType": "AWS Region", - "instanceType": "m4.4xlarge", - "currentGeneration": "Yes", - "instanceFamily": "General purpose", - "vcpu": "16", - "physicalProcessor": "Intel Xeon E5-2676 v3 (Haswell)", - "clockSpeed": "2.4 GHz", - "memory": "64 GiB", - "storage": "EBS only", - "networkPerformance": "High", - "processorArchitecture": "64-bit", - "tenancy": "Shared", - "operatingSystem": "Linux", - "licenseModel": "No License required", - "usagetype": "BoxUsage:m4.4xlarge", - "operation": "RunInstances", - "dedicatedEbsThroughput": "2000 Mbps", - "ecu": "53.5", - "enhancedNetworkingSupported": "Yes", - "normalizationSizeFactor": "32", - "preInstalledSw": "NA", - "processorFeatures": "Intel AVX; Intel AVX2; Intel Turbo", - "servicename": "Amazon Elastic Compute Cloud" - } - }, - "8VCNEHQMSCQS4P39": { - "sku": "8VCNEHQMSCQS4P39", - "productFamily": "Compute Instance", - "attributes": { - "servicecode": "AmazonEC2", - "location": "US East (N. Virginia)", - "locationType": "AWS Region", - "instanceType": "m4.large", - "currentGeneration": "Yes", - "instanceFamily": "General purpose", - "vcpu": "2", - "physicalProcessor": "Intel Xeon E5-2676 v3 (Haswell)", - "clockSpeed": "2.4 GHz", - "memory": "8 GiB", - "storage": "EBS only", - "networkPerformance": "Moderate", - "processorArchitecture": "64-bit", - "tenancy": "Shared", - "operatingSystem": "Linux", - "licenseModel": "No License required", - "usagetype": "BoxUsage:m4.large", - "operation": "RunInstances", - "dedicatedEbsThroughput": "450 Mbps", - "ecu": "6.5", - "enhancedNetworkingSupported": "Yes", - "normalizationSizeFactor": "4", - "preInstalledSw": "NA", - "processorFeatures": "Intel AVX; Intel AVX2; Intel Turbo", - "servicename": "Amazon Elastic Compute Cloud" - } - }, - "ECM8RSBXMC7F4WAS": { - "sku": "ECM8RSBXMC7F4WAS", - "productFamily": "Compute Instance", - "attributes": { - "servicecode": "AmazonEC2", - "location": "US East (N. Virginia)", - "locationType": "AWS Region", - "instanceType": "m4.16xlarge", - "currentGeneration": "Yes", - "instanceFamily": "General purpose", - "vcpu": "64", - "physicalProcessor": "Intel Xeon E5-2686 v4 (Broadwell)", - "clockSpeed": "2.3 GHz", - "memory": "256 GiB", - "storage": "EBS only", - "networkPerformance": "20 Gigabit", - "processorArchitecture": "64-bit", - "tenancy": "Shared", - "operatingSystem": "Linux", - "licenseModel": "No License required", - "usagetype": "BoxUsage:m4.16xlarge", - "operation": "RunInstances", - "dedicatedEbsThroughput": "10000 Mbps", - "ecu": "188", - "enhancedNetworkingSupported": "Yes", - "normalizationSizeFactor": "128", - "preInstalledSw": "NA", - "processorFeatures": "Intel AVX, Intel AVX2, Intel Turbo", - "servicename": "Amazon Elastic Compute Cloud" - } - }, - "J4T9ZF4AJ2DXE7SA": { - "sku": "J4T9ZF4AJ2DXE7SA", - "productFamily": "Compute Instance", - "attributes": { - "servicecode": "AmazonEC2", - "location": "US East (N. Virginia)", - "locationType": "AWS Region", - "instanceType": "m4.10xlarge", - "currentGeneration": "Yes", - "instanceFamily": "General purpose", - "vcpu": "40", - "physicalProcessor": "Intel Xeon E5-2676 v3 (Haswell)", - "clockSpeed": "2.4 GHz", - "memory": "160 GiB", - "storage": "EBS only", - "networkPerformance": "10 Gigabit", - "processorArchitecture": "64-bit", - "tenancy": "Shared", - "operatingSystem": "Linux", - "licenseModel": "No License required", - "usagetype": "BoxUsage:m4.10xlarge", - "operation": "RunInstances", - "dedicatedEbsThroughput": "4000 Mbps", - "ecu": "124.5", - "enhancedNetworkingSupported": "Yes", - "normalizationSizeFactor": "80", - "preInstalledSw": "NA", - "processorFeatures": "Intel AVX; Intel AVX2; Intel Turbo", - "servicename": "Amazon Elastic Compute Cloud" - } - }, - "47GP959QAF69YPG5": { - "sku": "47GP959QAF69YPG5", - "productFamily": "Compute Instance", - "attributes": { - "servicecode": "AmazonEC2", - "location": "US East (N. Virginia)", - "locationType": "AWS Region", - "instanceType": "m4.xlarge", - "currentGeneration": "Yes", - "instanceFamily": "General purpose", - "vcpu": "4", - "physicalProcessor": "Intel Xeon E5-2676 v3 (Haswell)", - "clockSpeed": "2.4 GHz", - "memory": "16 GiB", - "storage": "EBS only", - "networkPerformance": "High", - "processorArchitecture": "64-bit", - "tenancy": "Shared", - "operatingSystem": "Linux", - "licenseModel": "No License required", - "usagetype": "BoxUsage:m4.xlarge", - "operation": "RunInstances", - "dedicatedEbsThroughput": "750 Mbps", - "ecu": "13", - "enhancedNetworkingSupported": "Yes", - "normalizationSizeFactor": "8", - "preInstalledSw": "NA", - "processorFeatures": "Intel AVX; Intel AVX2; Intel Turbo", - "servicename": "Amazon Elastic Compute Cloud" - } - }, - "VHC3YWSZ6ZFZPJN4": { - "sku": "VHC3YWSZ6ZFZPJN4", - "productFamily": "Compute Instance", - "attributes": { - "servicecode": "AmazonEC2", - "location": "US East (N. Virginia)", - "locationType": "AWS Region", - "instanceType": "m4.2xlarge", - "currentGeneration": "Yes", - "instanceFamily": "General purpose", - "vcpu": "8", - "physicalProcessor": "Intel Xeon E5-2676 v3 (Haswell)", - "clockSpeed": "2.4 GHz", - "memory": "32 GiB", - "storage": "EBS only", - "networkPerformance": "High", - "processorArchitecture": "64-bit", - "tenancy": "Shared", - "operatingSystem": "Linux", - "licenseModel": "No License required", - "usagetype": "BoxUsage:m4.2xlarge", - "operation": "RunInstances", - "dedicatedEbsThroughput": "1000 Mbps", - "ecu": "26", - "enhancedNetworkingSupported": "Yes", - "normalizationSizeFactor": "16", - "preInstalledSw": "NA", - "processorFeatures": "Intel AVX; Intel AVX2; Intel Turbo", - "servicename": "Amazon Elastic Compute Cloud" - } - } - }, - "terms": { - "OnDemand": { - "47GP959QAF69YPG5": { - "47GP959QAF69YPG5.JRTCKXETXF": { - "offerTermCode": "JRTCKXETXF", - "sku": "47GP959QAF69YPG5", - "effectiveDate": "2017-11-01T00:00:00Z", - "priceDimensions": { - "47GP959QAF69YPG5.JRTCKXETXF.6YS6EN2CT7": { - "rateCode": "47GP959QAF69YPG5.JRTCKXETXF.6YS6EN2CT7", - "description": "$0.20 per On Demand Linux m4.xlarge Instance Hour", - "beginRange": "0", - "endRange": "Inf", - "unit": "Hrs", - "pricePerUnit": { - "USD": "0.2000000000" - }, - "appliesTo": [] - } - }, - "termAttributes": {} - } - }, - "J4T9ZF4AJ2DXE7SA": { - "J4T9ZF4AJ2DXE7SA.JRTCKXETXF": { - "offerTermCode": "JRTCKXETXF", - "sku": "J4T9ZF4AJ2DXE7SA", - "effectiveDate": "2017-11-01T00:00:00Z", - "priceDimensions": { - "J4T9ZF4AJ2DXE7SA.JRTCKXETXF.6YS6EN2CT7": { - "rateCode": "J4T9ZF4AJ2DXE7SA.JRTCKXETXF.6YS6EN2CT7", - "description": "$2.00 per On Demand Linux m4.10xlarge Instance Hour", - "beginRange": "0", - "endRange": "Inf", - "unit": "Hrs", - "pricePerUnit": { - "USD": "2.0000000000" - }, - "appliesTo": [] - } - }, - "termAttributes": {} - } - }, - "8VCNEHQMSCQS4P39": { - "8VCNEHQMSCQS4P39.JRTCKXETXF": { - "offerTermCode": "JRTCKXETXF", - "sku": "8VCNEHQMSCQS4P39", - "effectiveDate": "2017-11-01T00:00:00Z", - "priceDimensions": { - "8VCNEHQMSCQS4P39.JRTCKXETXF.6YS6EN2CT7": { - "rateCode": "8VCNEHQMSCQS4P39.JRTCKXETXF.6YS6EN2CT7", - "description": "$0.10 per On Demand Linux m4.large Instance Hour", - "beginRange": "0", - "endRange": "Inf", - "unit": "Hrs", - "pricePerUnit": { - "USD": "0.1000000000" - }, - "appliesTo": [] - } - }, - "termAttributes": {} - } - }, - "ECM8RSBXMC7F4WAS": { - "ECM8RSBXMC7F4WAS.JRTCKXETXF": { - "offerTermCode": "JRTCKXETXF", - "sku": "ECM8RSBXMC7F4WAS", - "effectiveDate": "2017-11-01T00:00:00Z", - "priceDimensions": { - "ECM8RSBXMC7F4WAS.JRTCKXETXF.6YS6EN2CT7": { - "rateCode": "ECM8RSBXMC7F4WAS.JRTCKXETXF.6YS6EN2CT7", - "description": "$3.20 per On Demand Linux m4.16xlarge Instance Hour", - "beginRange": "0", - "endRange": "Inf", - "unit": "Hrs", - "pricePerUnit": { - "USD": "3.2000000000" - }, - "appliesTo": [] - } - }, - "termAttributes": {} - } - }, - "VHC3YWSZ6ZFZPJN4": { - "VHC3YWSZ6ZFZPJN4.JRTCKXETXF": { - "offerTermCode": "JRTCKXETXF", - "sku": "VHC3YWSZ6ZFZPJN4", - "effectiveDate": "2017-11-01T00:00:00Z", - "priceDimensions": { - "VHC3YWSZ6ZFZPJN4.JRTCKXETXF.6YS6EN2CT7": { - "rateCode": "VHC3YWSZ6ZFZPJN4.JRTCKXETXF.6YS6EN2CT7", - "description": "$0.40 per On Demand Linux m4.2xlarge Instance Hour", - "beginRange": "0", - "endRange": "Inf", - "unit": "Hrs", - "pricePerUnit": { - "USD": "0.4000000000" - }, - "appliesTo": [] - } - }, - "termAttributes": {} - } - }, - "3UP33R2RXCADSPSX": { - "3UP33R2RXCADSPSX.JRTCKXETXF": { - "offerTermCode": "JRTCKXETXF", - "sku": "3UP33R2RXCADSPSX", - "effectiveDate": "2017-11-01T00:00:00Z", - "priceDimensions": { - "3UP33R2RXCADSPSX.JRTCKXETXF.6YS6EN2CT7": { - "rateCode": "3UP33R2RXCADSPSX.JRTCKXETXF.6YS6EN2CT7", - "description": "$0.80 per On Demand Linux m4.4xlarge Instance Hour", - "beginRange": "0", - "endRange": "Inf", - "unit": "Hrs", - "pricePerUnit": { - "USD": "0.8000000000" - }, - "appliesTo": [] - } - }, - "termAttributes": {} - } - } - } - } -} diff --git a/cluster-autoscaler/cloudprovider/aws/api/pricing_ondemand_eu-west-1.json b/cluster-autoscaler/cloudprovider/aws/api/pricing_ondemand_eu-west-1.json new file mode 100644 index 000000000000..c16078c396e0 --- /dev/null +++ b/cluster-autoscaler/cloudprovider/aws/api/pricing_ondemand_eu-west-1.json @@ -0,0 +1,20 @@ +{ + "PriceList": [ + "{\"product\":{\"productFamily\":\"Compute Instance\",\"attributes\":{\"enhancedNetworkingSupported\":\"Yes\",\"memory\":\"16 GiB\",\"dedicatedEbsThroughput\":\"750 Mbps\",\"vcpu\":\"4\",\"capacitystatus\":\"Used\",\"locationType\":\"AWS Region\",\"storage\":\"EBS only\",\"instanceFamily\":\"General purpose\",\"operatingSystem\":\"Windows\",\"physicalProcessor\":\"Intel Xeon E5-2676 v3 (Haswell)\",\"clockSpeed\":\"2.4 GHz\",\"ecu\":\"13\",\"networkPerformance\":\"High\",\"servicename\":\"Amazon Elastic Compute Cloud\",\"instanceType\":\"m4.xlarge\",\"tenancy\":\"Dedicated\",\"usagetype\":\"EU-DedicatedUsage:m4.xlarge\",\"normalizationSizeFactor\":\"8\",\"processorFeatures\":\"Intel AVX; Intel AVX2; Intel Turbo\",\"servicecode\":\"AmazonEC2\",\"licenseModel\":\"No License required\",\"currentGeneration\":\"Yes\",\"preInstalledSw\":\"NA\",\"location\":\"EU (Ireland)\",\"processorArchitecture\":\"64-bit\",\"operation\":\"RunInstances:0002\"},\"sku\":\"5BPT2UQ5P4XGF9CU\"},\"serviceCode\":\"AmazonEC2\",\"terms\":{\"OnDemand\":{\"5BPT2UQ5P4XGF9CU.JRTCKXETXF\":{\"priceDimensions\":{\"5BPT2UQ5P4XGF9CU.JRTCKXETXF.6YS6EN2CT7\":{\"unit\":\"Hrs\",\"endRange\":\"Inf\",\"description\":\"$0.4282 per Dedicated Windows m4.xlarge Instance Hour\",\"appliesTo\":[],\"rateCode\":\"5BPT2UQ5P4XGF9CU.JRTCKXETXF.6YS6EN2CT7\",\"beginRange\":\"0\",\"pricePerUnit\":{\"USD\":\"0.4282000000\"}}},\"sku\":\"5BPT2UQ5P4XGF9CU\",\"effectiveDate\":\"2019-01-01T00:00:00Z\",\"offerTermCode\":\"JRTCKXETXF\",\"termAttributes\":{}}},\"Reserved\":{\"5BPT2UQ5P4XGF9CU.MZU6U2429S\":{\"priceDimensions\":{\"5BPT2UQ5P4XGF9CU.MZU6U2429S.2TG2D8R56U\":{\"unit\":\"Quantity\",\"description\":\"Upfront Fee\",\"appliesTo\":[],\"rateCode\":\"5BPT2UQ5P4XGF9CU.MZU6U2429S.2TG2D8R56U\",\"pricePerUnit\":{\"USD\":\"8093\"}},\"5BPT2UQ5P4XGF9CU.MZU6U2429S.6YS6EN2CT7\":{\"unit\":\"Hrs\",\"endRange\":\"Inf\",\"description\":\"USD 0.0 per Windows (Amazon VPC), m4.xlarge reserved instance applied\",\"appliesTo\":[],\"rateCode\":\"5BPT2UQ5P4XGF9CU.MZU6U2429S.6YS6EN2CT7\",\"beginRange\":\"0\",\"pricePerUnit\":{\"USD\":\"0.0000000000\"}}},\"sku\":\"5BPT2UQ5P4XGF9CU\",\"effectiveDate\":\"2017-04-30T23:59:59Z\",\"offerTermCode\":\"MZU6U2429S\",\"termAttributes\":{\"LeaseContractLength\":\"3yr\",\"OfferingClass\":\"convertible\",\"PurchaseOption\":\"All Upfront\"}},\"5BPT2UQ5P4XGF9CU.BPH4J8HBKS\":{\"priceDimensions\":{\"5BPT2UQ5P4XGF9CU.BPH4J8HBKS.6YS6EN2CT7\":{\"unit\":\"Hrs\",\"endRange\":\"Inf\",\"description\":\"Windows (Amazon VPC), m4.xlarge reserved instance applied\",\"appliesTo\":[],\"rateCode\":\"5BPT2UQ5P4XGF9CU.BPH4J8HBKS.6YS6EN2CT7\",\"beginRange\":\"0\",\"pricePerUnit\":{\"USD\":\"0.3028000000\"}}},\"sku\":\"5BPT2UQ5P4XGF9CU\",\"effectiveDate\":\"2017-04-30T23:59:59Z\",\"offerTermCode\":\"BPH4J8HBKS\",\"termAttributes\":{\"LeaseContractLength\":\"3yr\",\"OfferingClass\":\"standard\",\"PurchaseOption\":\"No Upfront\"}},\"5BPT2UQ5P4XGF9CU.NQ3QZPMQV9\":{\"priceDimensions\":{\"5BPT2UQ5P4XGF9CU.NQ3QZPMQV9.2TG2D8R56U\":{\"unit\":\"Quantity\",\"description\":\"Upfront Fee\",\"appliesTo\":[],\"rateCode\":\"5BPT2UQ5P4XGF9CU.NQ3QZPMQV9.2TG2D8R56U\",\"pricePerUnit\":{\"USD\":\"7553\"}},\"5BPT2UQ5P4XGF9CU.NQ3QZPMQV9.6YS6EN2CT7\":{\"unit\":\"Hrs\",\"endRange\":\"Inf\",\"description\":\"USD 0.0 per Windows (Amazon VPC), m4.xlarge reserved instance applied\",\"appliesTo\":[],\"rateCode\":\"5BPT2UQ5P4XGF9CU.NQ3QZPMQV9.6YS6EN2CT7\",\"beginRange\":\"0\",\"pricePerUnit\":{\"USD\":\"0.0000000000\"}}},\"sku\":\"5BPT2UQ5P4XGF9CU\",\"effectiveDate\":\"2017-04-30T23:59:59Z\",\"offerTermCode\":\"NQ3QZPMQV9\",\"termAttributes\":{\"LeaseContractLength\":\"3yr\",\"OfferingClass\":\"standard\",\"PurchaseOption\":\"All Upfront\"}},\"5BPT2UQ5P4XGF9CU.VJWZNREJX2\":{\"priceDimensions\":{\"5BPT2UQ5P4XGF9CU.VJWZNREJX2.2TG2D8R56U\":{\"unit\":\"Quantity\",\"description\":\"Upfront Fee\",\"appliesTo\":[],\"rateCode\":\"5BPT2UQ5P4XGF9CU.VJWZNREJX2.2TG2D8R56U\",\"pricePerUnit\":{\"USD\":\"3176\"}},\"5BPT2UQ5P4XGF9CU.VJWZNREJX2.6YS6EN2CT7\":{\"unit\":\"Hrs\",\"endRange\":\"Inf\",\"description\":\"Windows (Amazon VPC), m4.xlarge reserved instance applied\",\"appliesTo\":[],\"rateCode\":\"5BPT2UQ5P4XGF9CU.VJWZNREJX2.6YS6EN2CT7\",\"beginRange\":\"0\",\"pricePerUnit\":{\"USD\":\"0.0000000000\"}}},\"sku\":\"5BPT2UQ5P4XGF9CU\",\"effectiveDate\":\"2017-10-31T23:59:59Z\",\"offerTermCode\":\"VJWZNREJX2\",\"termAttributes\":{\"LeaseContractLength\":\"1yr\",\"OfferingClass\":\"convertible\",\"PurchaseOption\":\"All Upfront\"}},\"5BPT2UQ5P4XGF9CU.38NPMPTW36\":{\"priceDimensions\":{\"5BPT2UQ5P4XGF9CU.38NPMPTW36.2TG2D8R56U\":{\"unit\":\"Quantity\",\"description\":\"Upfront Fee\",\"appliesTo\":[],\"rateCode\":\"5BPT2UQ5P4XGF9CU.38NPMPTW36.2TG2D8R56U\",\"pricePerUnit\":{\"USD\":\"3863\"}},\"5BPT2UQ5P4XGF9CU.38NPMPTW36.6YS6EN2CT7\":{\"unit\":\"Hrs\",\"endRange\":\"Inf\",\"description\":\"Windows (Amazon VPC), m4.xlarge reserved instance applied\",\"appliesTo\":[],\"rateCode\":\"5BPT2UQ5P4XGF9CU.38NPMPTW36.6YS6EN2CT7\",\"beginRange\":\"0\",\"pricePerUnit\":{\"USD\":\"0.1470000000\"}}},\"sku\":\"5BPT2UQ5P4XGF9CU\",\"effectiveDate\":\"2017-04-30T23:59:59Z\",\"offerTermCode\":\"38NPMPTW36\",\"termAttributes\":{\"LeaseContractLength\":\"3yr\",\"OfferingClass\":\"standard\",\"PurchaseOption\":\"Partial Upfront\"}},\"5BPT2UQ5P4XGF9CU.R5XV2EPZQZ\":{\"priceDimensions\":{\"5BPT2UQ5P4XGF9CU.R5XV2EPZQZ.6YS6EN2CT7\":{\"unit\":\"Hrs\",\"endRange\":\"Inf\",\"description\":\"Windows (Amazon VPC), m4.xlarge reserved instance applied\",\"appliesTo\":[],\"rateCode\":\"5BPT2UQ5P4XGF9CU.R5XV2EPZQZ.6YS6EN2CT7\",\"beginRange\":\"0\",\"pricePerUnit\":{\"USD\":\"0.1553000000\"}},\"5BPT2UQ5P4XGF9CU.R5XV2EPZQZ.2TG2D8R56U\":{\"unit\":\"Quantity\",\"description\":\"Upfront Fee\",\"appliesTo\":[],\"rateCode\":\"5BPT2UQ5P4XGF9CU.R5XV2EPZQZ.2TG2D8R56U\",\"pricePerUnit\":{\"USD\":\"4080\"}}},\"sku\":\"5BPT2UQ5P4XGF9CU\",\"effectiveDate\":\"2017-04-30T23:59:59Z\",\"offerTermCode\":\"R5XV2EPZQZ\",\"termAttributes\":{\"LeaseContractLength\":\"3yr\",\"OfferingClass\":\"convertible\",\"PurchaseOption\":\"Partial Upfront\"}},\"5BPT2UQ5P4XGF9CU.4NA7Y494T4\":{\"priceDimensions\":{\"5BPT2UQ5P4XGF9CU.4NA7Y494T4.6YS6EN2CT7\":{\"unit\":\"Hrs\",\"endRange\":\"Inf\",\"description\":\"Windows (Amazon VPC), m4.xlarge reserved instance applied\",\"appliesTo\":[],\"rateCode\":\"5BPT2UQ5P4XGF9CU.4NA7Y494T4.6YS6EN2CT7\",\"beginRange\":\"0\",\"pricePerUnit\":{\"USD\":\"0.3503000000\"}}},\"sku\":\"5BPT2UQ5P4XGF9CU\",\"effectiveDate\":\"2017-04-30T23:59:59Z\",\"offerTermCode\":\"4NA7Y494T4\",\"termAttributes\":{\"LeaseContractLength\":\"1yr\",\"OfferingClass\":\"standard\",\"PurchaseOption\":\"No Upfront\"}},\"5BPT2UQ5P4XGF9CU.6QCMYABX3D\":{\"priceDimensions\":{\"5BPT2UQ5P4XGF9CU.6QCMYABX3D.2TG2D8R56U\":{\"unit\":\"Quantity\",\"description\":\"Upfront Fee\",\"appliesTo\":[],\"rateCode\":\"5BPT2UQ5P4XGF9CU.6QCMYABX3D.2TG2D8R56U\",\"pricePerUnit\":{\"USD\":\"2972\"}},\"5BPT2UQ5P4XGF9CU.6QCMYABX3D.6YS6EN2CT7\":{\"unit\":\"Hrs\",\"endRange\":\"Inf\",\"description\":\"USD 0.0 per Windows (Amazon VPC), m4.xlarge reserved instance applied\",\"appliesTo\":[],\"rateCode\":\"5BPT2UQ5P4XGF9CU.6QCMYABX3D.6YS6EN2CT7\",\"beginRange\":\"0\",\"pricePerUnit\":{\"USD\":\"0.0000000000\"}}},\"sku\":\"5BPT2UQ5P4XGF9CU\",\"effectiveDate\":\"2017-04-30T23:59:59Z\",\"offerTermCode\":\"6QCMYABX3D\",\"termAttributes\":{\"LeaseContractLength\":\"1yr\",\"OfferingClass\":\"standard\",\"PurchaseOption\":\"All Upfront\"}},\"5BPT2UQ5P4XGF9CU.Z2E3P23VKM\":{\"priceDimensions\":{\"5BPT2UQ5P4XGF9CU.Z2E3P23VKM.6YS6EN2CT7\":{\"unit\":\"Hrs\",\"endRange\":\"Inf\",\"description\":\"Windows (Amazon VPC), m4.xlarge reserved instance applied\",\"appliesTo\":[],\"rateCode\":\"5BPT2UQ5P4XGF9CU.Z2E3P23VKM.6YS6EN2CT7\",\"beginRange\":\"0\",\"pricePerUnit\":{\"USD\":\"0.3206000000\"}}},\"sku\":\"5BPT2UQ5P4XGF9CU\",\"effectiveDate\":\"2017-04-30T23:59:59Z\",\"offerTermCode\":\"Z2E3P23VKM\",\"termAttributes\":{\"LeaseContractLength\":\"3yr\",\"OfferingClass\":\"convertible\",\"PurchaseOption\":\"No Upfront\"}},\"5BPT2UQ5P4XGF9CU.HU7G6KETJZ\":{\"priceDimensions\":{\"5BPT2UQ5P4XGF9CU.HU7G6KETJZ.2TG2D8R56U\":{\"unit\":\"Quantity\",\"description\":\"Upfront Fee\",\"appliesTo\":[],\"rateCode\":\"5BPT2UQ5P4XGF9CU.HU7G6KETJZ.2TG2D8R56U\",\"pricePerUnit\":{\"USD\":\"1500\"}},\"5BPT2UQ5P4XGF9CU.HU7G6KETJZ.6YS6EN2CT7\":{\"unit\":\"Hrs\",\"endRange\":\"Inf\",\"description\":\"Windows (Amazon VPC), m4.xlarge reserved instance applied\",\"appliesTo\":[],\"rateCode\":\"5BPT2UQ5P4XGF9CU.HU7G6KETJZ.6YS6EN2CT7\",\"beginRange\":\"0\",\"pricePerUnit\":{\"USD\":\"0.1712000000\"}}},\"sku\":\"5BPT2UQ5P4XGF9CU\",\"effectiveDate\":\"2017-04-30T23:59:59Z\",\"offerTermCode\":\"HU7G6KETJZ\",\"termAttributes\":{\"LeaseContractLength\":\"1yr\",\"OfferingClass\":\"standard\",\"PurchaseOption\":\"Partial Upfront\"}},\"5BPT2UQ5P4XGF9CU.CUZHX8X6JH\":{\"priceDimensions\":{\"5BPT2UQ5P4XGF9CU.CUZHX8X6JH.2TG2D8R56U\":{\"unit\":\"Quantity\",\"description\":\"Upfront Fee\",\"appliesTo\":[],\"rateCode\":\"5BPT2UQ5P4XGF9CU.CUZHX8X6JH.2TG2D8R56U\",\"pricePerUnit\":{\"USD\":\"1604\"}},\"5BPT2UQ5P4XGF9CU.CUZHX8X6JH.6YS6EN2CT7\":{\"unit\":\"Hrs\",\"endRange\":\"Inf\",\"description\":\"Windows (Amazon VPC), m4.xlarge reserved instance applied\",\"appliesTo\":[],\"rateCode\":\"5BPT2UQ5P4XGF9CU.CUZHX8X6JH.6YS6EN2CT7\",\"beginRange\":\"0\",\"pricePerUnit\":{\"USD\":\"0.1831000000\"}}},\"sku\":\"5BPT2UQ5P4XGF9CU\",\"effectiveDate\":\"2017-10-31T23:59:59Z\",\"offerTermCode\":\"CUZHX8X6JH\",\"termAttributes\":{\"LeaseContractLength\":\"1yr\",\"OfferingClass\":\"convertible\",\"PurchaseOption\":\"Partial Upfront\"}},\"5BPT2UQ5P4XGF9CU.7NE97W5U4E\":{\"priceDimensions\":{\"5BPT2UQ5P4XGF9CU.7NE97W5U4E.6YS6EN2CT7\":{\"unit\":\"Hrs\",\"endRange\":\"Inf\",\"description\":\"Windows (Amazon VPC), m4.xlarge reserved instance applied\",\"appliesTo\":[],\"rateCode\":\"5BPT2UQ5P4XGF9CU.7NE97W5U4E.6YS6EN2CT7\",\"beginRange\":\"0\",\"pricePerUnit\":{\"USD\":\"0.3753000000\"}}},\"sku\":\"5BPT2UQ5P4XGF9CU\",\"effectiveDate\":\"2017-10-31T23:59:59Z\",\"offerTermCode\":\"7NE97W5U4E\",\"termAttributes\":{\"LeaseContractLength\":\"1yr\",\"OfferingClass\":\"convertible\",\"PurchaseOption\":\"No Upfront\"}}}},\"version\":\"20190116212448\",\"publicationDate\":\"2019-01-16T21:24:48Z\"}", + "{\"product\":{\"productFamily\":\"Compute Instance\",\"attributes\":{\"enhancedNetworkingSupported\":\"Yes\",\"memory\":\"16 GiB\",\"dedicatedEbsThroughput\":\"750 Mbps\",\"vcpu\":\"4\",\"capacitystatus\":\"Used\",\"locationType\":\"AWS Region\",\"storage\":\"EBS only\",\"instanceFamily\":\"General purpose\",\"operatingSystem\":\"Linux\",\"physicalProcessor\":\"Intel Xeon E5-2676 v3 (Haswell)\",\"clockSpeed\":\"2.4 GHz\",\"ecu\":\"13\",\"networkPerformance\":\"High\",\"servicename\":\"Amazon Elastic Compute Cloud\",\"instanceType\":\"m4.xlarge\",\"tenancy\":\"Shared\",\"usagetype\":\"EU-BoxUsage:m4.xlarge\",\"normalizationSizeFactor\":\"8\",\"processorFeatures\":\"Intel AVX; Intel AVX2; Intel Turbo\",\"servicecode\":\"AmazonEC2\",\"licenseModel\":\"No License required\",\"currentGeneration\":\"Yes\",\"preInstalledSw\":\"NA\",\"location\":\"EU (Ireland)\",\"processorArchitecture\":\"64-bit\",\"operation\":\"RunInstances\"},\"sku\":\"6FU9JEK79WWSARQ9\"},\"serviceCode\":\"AmazonEC2\",\"terms\":{\"OnDemand\":{\"6FU9JEK79WWSARQ9.JRTCKXETXF\":{\"priceDimensions\":{\"6FU9JEK79WWSARQ9.JRTCKXETXF.6YS6EN2CT7\":{\"unit\":\"Hrs\",\"endRange\":\"Inf\",\"description\":\"$0.222 per On Demand Linux m4.xlarge Instance Hour\",\"appliesTo\":[],\"rateCode\":\"6FU9JEK79WWSARQ9.JRTCKXETXF.6YS6EN2CT7\",\"beginRange\":\"0\",\"pricePerUnit\":{\"USD\":\"0.2220000000\"}}},\"sku\":\"6FU9JEK79WWSARQ9\",\"effectiveDate\":\"2019-01-01T00:00:00Z\",\"offerTermCode\":\"JRTCKXETXF\",\"termAttributes\":{}}},\"Reserved\":{\"6FU9JEK79WWSARQ9.MZU6U2429S\":{\"priceDimensions\":{\"6FU9JEK79WWSARQ9.MZU6U2429S.2TG2D8R56U\":{\"unit\":\"Quantity\",\"description\":\"Upfront Fee\",\"appliesTo\":[],\"rateCode\":\"6FU9JEK79WWSARQ9.MZU6U2429S.2TG2D8R56U\",\"pricePerUnit\":{\"USD\":\"2962\"}},\"6FU9JEK79WWSARQ9.MZU6U2429S.6YS6EN2CT7\":{\"unit\":\"Hrs\",\"endRange\":\"Inf\",\"description\":\"USD 0.0 per Linux/UNIX (Amazon VPC), m4.xlarge reserved instance applied\",\"appliesTo\":[],\"rateCode\":\"6FU9JEK79WWSARQ9.MZU6U2429S.6YS6EN2CT7\",\"beginRange\":\"0\",\"pricePerUnit\":{\"USD\":\"0.0000000000\"}}},\"sku\":\"6FU9JEK79WWSARQ9\",\"effectiveDate\":\"2017-04-30T23:59:59Z\",\"offerTermCode\":\"MZU6U2429S\",\"termAttributes\":{\"LeaseContractLength\":\"3yr\",\"OfferingClass\":\"convertible\",\"PurchaseOption\":\"All Upfront\"}},\"6FU9JEK79WWSARQ9.BPH4J8HBKS\":{\"priceDimensions\":{\"6FU9JEK79WWSARQ9.BPH4J8HBKS.6YS6EN2CT7\":{\"unit\":\"Hrs\",\"endRange\":\"Inf\",\"description\":\"Linux/UNIX (Amazon VPC), m4.xlarge reserved instance applied\",\"appliesTo\":[],\"rateCode\":\"6FU9JEK79WWSARQ9.BPH4J8HBKS.6YS6EN2CT7\",\"beginRange\":\"0\",\"pricePerUnit\":{\"USD\":\"0.1080000000\"}}},\"sku\":\"6FU9JEK79WWSARQ9\",\"effectiveDate\":\"2017-04-30T23:59:59Z\",\"offerTermCode\":\"BPH4J8HBKS\",\"termAttributes\":{\"LeaseContractLength\":\"3yr\",\"OfferingClass\":\"standard\",\"PurchaseOption\":\"No Upfront\"}},\"6FU9JEK79WWSARQ9.NQ3QZPMQV9\":{\"priceDimensions\":{\"6FU9JEK79WWSARQ9.NQ3QZPMQV9.2TG2D8R56U\":{\"unit\":\"Quantity\",\"description\":\"Upfront Fee\",\"appliesTo\":[],\"rateCode\":\"6FU9JEK79WWSARQ9.NQ3QZPMQV9.2TG2D8R56U\",\"pricePerUnit\":{\"USD\":\"2470\"}},\"6FU9JEK79WWSARQ9.NQ3QZPMQV9.6YS6EN2CT7\":{\"unit\":\"Hrs\",\"endRange\":\"Inf\",\"description\":\"USD 0.0 per Linux/UNIX (Amazon VPC), m4.xlarge reserved instance applied\",\"appliesTo\":[],\"rateCode\":\"6FU9JEK79WWSARQ9.NQ3QZPMQV9.6YS6EN2CT7\",\"beginRange\":\"0\",\"pricePerUnit\":{\"USD\":\"0.0000000000\"}}},\"sku\":\"6FU9JEK79WWSARQ9\",\"effectiveDate\":\"2017-04-30T23:59:59Z\",\"offerTermCode\":\"NQ3QZPMQV9\",\"termAttributes\":{\"LeaseContractLength\":\"3yr\",\"OfferingClass\":\"standard\",\"PurchaseOption\":\"All Upfront\"}},\"6FU9JEK79WWSARQ9.Z2E3P23VKM\":{\"priceDimensions\":{\"6FU9JEK79WWSARQ9.Z2E3P23VKM.6YS6EN2CT7\":{\"unit\":\"Hrs\",\"endRange\":\"Inf\",\"description\":\"Linux/UNIX (Amazon VPC), m4.xlarge reserved instance applied\",\"appliesTo\":[],\"rateCode\":\"6FU9JEK79WWSARQ9.Z2E3P23VKM.6YS6EN2CT7\",\"beginRange\":\"0\",\"pricePerUnit\":{\"USD\":\"0.1242000000\"}}},\"sku\":\"6FU9JEK79WWSARQ9\",\"effectiveDate\":\"2017-04-30T23:59:59Z\",\"offerTermCode\":\"Z2E3P23VKM\",\"termAttributes\":{\"LeaseContractLength\":\"3yr\",\"OfferingClass\":\"convertible\",\"PurchaseOption\":\"No Upfront\"}},\"6FU9JEK79WWSARQ9.4NA7Y494T4\":{\"priceDimensions\":{\"6FU9JEK79WWSARQ9.4NA7Y494T4.6YS6EN2CT7\":{\"unit\":\"Hrs\",\"endRange\":\"Inf\",\"description\":\"Linux/UNIX (Amazon VPC), m4.xlarge reserved instance applied\",\"appliesTo\":[],\"rateCode\":\"6FU9JEK79WWSARQ9.4NA7Y494T4.6YS6EN2CT7\",\"beginRange\":\"0\",\"pricePerUnit\":{\"USD\":\"0.1512000000\"}}},\"sku\":\"6FU9JEK79WWSARQ9\",\"effectiveDate\":\"2017-04-30T23:59:59Z\",\"offerTermCode\":\"4NA7Y494T4\",\"termAttributes\":{\"LeaseContractLength\":\"1yr\",\"OfferingClass\":\"standard\",\"PurchaseOption\":\"No Upfront\"}},\"6FU9JEK79WWSARQ9.CUZHX8X6JH\":{\"priceDimensions\":{\"6FU9JEK79WWSARQ9.CUZHX8X6JH.2TG2D8R56U\":{\"unit\":\"Quantity\",\"description\":\"Upfront Fee\",\"appliesTo\":[],\"rateCode\":\"6FU9JEK79WWSARQ9.CUZHX8X6JH.2TG2D8R56U\",\"pricePerUnit\":{\"USD\":\"725\"}},\"6FU9JEK79WWSARQ9.CUZHX8X6JH.6YS6EN2CT7\":{\"unit\":\"Hrs\",\"endRange\":\"Inf\",\"description\":\"Linux/UNIX (Amazon VPC), m4.xlarge reserved instance applied\",\"appliesTo\":[],\"rateCode\":\"6FU9JEK79WWSARQ9.CUZHX8X6JH.6YS6EN2CT7\",\"beginRange\":\"0\",\"pricePerUnit\":{\"USD\":\"0.0828000000\"}}},\"sku\":\"6FU9JEK79WWSARQ9\",\"effectiveDate\":\"2017-10-31T23:59:59Z\",\"offerTermCode\":\"CUZHX8X6JH\",\"termAttributes\":{\"LeaseContractLength\":\"1yr\",\"OfferingClass\":\"convertible\",\"PurchaseOption\":\"Partial Upfront\"}},\"6FU9JEK79WWSARQ9.VJWZNREJX2\":{\"priceDimensions\":{\"6FU9JEK79WWSARQ9.VJWZNREJX2.2TG2D8R56U\":{\"unit\":\"Quantity\",\"description\":\"Upfront Fee\",\"appliesTo\":[],\"rateCode\":\"6FU9JEK79WWSARQ9.VJWZNREJX2.2TG2D8R56U\",\"pricePerUnit\":{\"USD\":\"1422\"}},\"6FU9JEK79WWSARQ9.VJWZNREJX2.6YS6EN2CT7\":{\"unit\":\"Hrs\",\"endRange\":\"Inf\",\"description\":\"Linux/UNIX (Amazon VPC), m4.xlarge reserved instance applied\",\"appliesTo\":[],\"rateCode\":\"6FU9JEK79WWSARQ9.VJWZNREJX2.6YS6EN2CT7\",\"beginRange\":\"0\",\"pricePerUnit\":{\"USD\":\"0.0000000000\"}}},\"sku\":\"6FU9JEK79WWSARQ9\",\"effectiveDate\":\"2017-10-31T23:59:59Z\",\"offerTermCode\":\"VJWZNREJX2\",\"termAttributes\":{\"LeaseContractLength\":\"1yr\",\"OfferingClass\":\"convertible\",\"PurchaseOption\":\"All Upfront\"}},\"6FU9JEK79WWSARQ9.HU7G6KETJZ\":{\"priceDimensions\":{\"6FU9JEK79WWSARQ9.HU7G6KETJZ.2TG2D8R56U\":{\"unit\":\"Quantity\",\"description\":\"Upfront Fee\",\"appliesTo\":[],\"rateCode\":\"6FU9JEK79WWSARQ9.HU7G6KETJZ.2TG2D8R56U\",\"pricePerUnit\":{\"USD\":\"631\"}},\"6FU9JEK79WWSARQ9.HU7G6KETJZ.6YS6EN2CT7\":{\"unit\":\"Hrs\",\"endRange\":\"Inf\",\"description\":\"Linux/UNIX (Amazon VPC), m4.xlarge reserved instance applied\",\"appliesTo\":[],\"rateCode\":\"6FU9JEK79WWSARQ9.HU7G6KETJZ.6YS6EN2CT7\",\"beginRange\":\"0\",\"pricePerUnit\":{\"USD\":\"0.0720000000\"}}},\"sku\":\"6FU9JEK79WWSARQ9\",\"effectiveDate\":\"2017-04-30T23:59:59Z\",\"offerTermCode\":\"HU7G6KETJZ\",\"termAttributes\":{\"LeaseContractLength\":\"1yr\",\"OfferingClass\":\"standard\",\"PurchaseOption\":\"Partial Upfront\"}},\"6FU9JEK79WWSARQ9.7NE97W5U4E\":{\"priceDimensions\":{\"6FU9JEK79WWSARQ9.7NE97W5U4E.6YS6EN2CT7\":{\"unit\":\"Hrs\",\"endRange\":\"Inf\",\"description\":\"Linux/UNIX (Amazon VPC), m4.xlarge reserved instance applied\",\"appliesTo\":[],\"rateCode\":\"6FU9JEK79WWSARQ9.7NE97W5U4E.6YS6EN2CT7\",\"beginRange\":\"0\",\"pricePerUnit\":{\"USD\":\"0.1739000000\"}}},\"sku\":\"6FU9JEK79WWSARQ9\",\"effectiveDate\":\"2017-10-31T23:59:59Z\",\"offerTermCode\":\"7NE97W5U4E\",\"termAttributes\":{\"LeaseContractLength\":\"1yr\",\"OfferingClass\":\"convertible\",\"PurchaseOption\":\"No Upfront\"}},\"6FU9JEK79WWSARQ9.6QCMYABX3D\":{\"priceDimensions\":{\"6FU9JEK79WWSARQ9.6QCMYABX3D.2TG2D8R56U\":{\"unit\":\"Quantity\",\"description\":\"Upfront Fee\",\"appliesTo\":[],\"rateCode\":\"6FU9JEK79WWSARQ9.6QCMYABX3D.2TG2D8R56U\",\"pricePerUnit\":{\"USD\":\"1236\"}},\"6FU9JEK79WWSARQ9.6QCMYABX3D.6YS6EN2CT7\":{\"unit\":\"Hrs\",\"endRange\":\"Inf\",\"description\":\"USD 0.0 per Linux/UNIX (Amazon VPC), m4.xlarge reserved instance applied\",\"appliesTo\":[],\"rateCode\":\"6FU9JEK79WWSARQ9.6QCMYABX3D.6YS6EN2CT7\",\"beginRange\":\"0\",\"pricePerUnit\":{\"USD\":\"0.0000000000\"}}},\"sku\":\"6FU9JEK79WWSARQ9\",\"effectiveDate\":\"2017-04-30T23:59:59Z\",\"offerTermCode\":\"6QCMYABX3D\",\"termAttributes\":{\"LeaseContractLength\":\"1yr\",\"OfferingClass\":\"standard\",\"PurchaseOption\":\"All Upfront\"}},\"6FU9JEK79WWSARQ9.R5XV2EPZQZ\":{\"priceDimensions\":{\"6FU9JEK79WWSARQ9.R5XV2EPZQZ.6YS6EN2CT7\":{\"unit\":\"Hrs\",\"endRange\":\"Inf\",\"description\":\"Linux/UNIX (Amazon VPC), m4.xlarge reserved instance applied\",\"appliesTo\":[],\"rateCode\":\"6FU9JEK79WWSARQ9.R5XV2EPZQZ.6YS6EN2CT7\",\"beginRange\":\"0\",\"pricePerUnit\":{\"USD\":\"0.0575000000\"}},\"6FU9JEK79WWSARQ9.R5XV2EPZQZ.2TG2D8R56U\":{\"unit\":\"Quantity\",\"description\":\"Upfront Fee\",\"appliesTo\":[],\"rateCode\":\"6FU9JEK79WWSARQ9.R5XV2EPZQZ.2TG2D8R56U\",\"pricePerUnit\":{\"USD\":\"1511\"}}},\"sku\":\"6FU9JEK79WWSARQ9\",\"effectiveDate\":\"2017-04-30T23:59:59Z\",\"offerTermCode\":\"R5XV2EPZQZ\",\"termAttributes\":{\"LeaseContractLength\":\"3yr\",\"OfferingClass\":\"convertible\",\"PurchaseOption\":\"Partial Upfront\"}},\"6FU9JEK79WWSARQ9.38NPMPTW36\":{\"priceDimensions\":{\"6FU9JEK79WWSARQ9.38NPMPTW36.2TG2D8R56U\":{\"unit\":\"Quantity\",\"description\":\"Upfront Fee\",\"appliesTo\":[],\"rateCode\":\"6FU9JEK79WWSARQ9.38NPMPTW36.2TG2D8R56U\",\"pricePerUnit\":{\"USD\":\"1314\"}},\"6FU9JEK79WWSARQ9.38NPMPTW36.6YS6EN2CT7\":{\"unit\":\"Hrs\",\"endRange\":\"Inf\",\"description\":\"Linux/UNIX (Amazon VPC), m4.xlarge reserved instance applied\",\"appliesTo\":[],\"rateCode\":\"6FU9JEK79WWSARQ9.38NPMPTW36.6YS6EN2CT7\",\"beginRange\":\"0\",\"pricePerUnit\":{\"USD\":\"0.0500000000\"}}},\"sku\":\"6FU9JEK79WWSARQ9\",\"effectiveDate\":\"2017-04-30T23:59:59Z\",\"offerTermCode\":\"38NPMPTW36\",\"termAttributes\":{\"LeaseContractLength\":\"3yr\",\"OfferingClass\":\"standard\",\"PurchaseOption\":\"Partial Upfront\"}}}},\"version\":\"20190116212448\",\"publicationDate\":\"2019-01-16T21:24:48Z\"}", + "{\"product\":{\"productFamily\":\"Compute Instance\",\"attributes\":{\"enhancedNetworkingSupported\":\"Yes\",\"memory\":\"16 GiB\",\"dedicatedEbsThroughput\":\"750 Mbps\",\"vcpu\":\"4\",\"capacitystatus\":\"Used\",\"locationType\":\"AWS Region\",\"storage\":\"EBS only\",\"instanceFamily\":\"General purpose\",\"operatingSystem\":\"SUSE\",\"physicalProcessor\":\"Intel Xeon E5-2676 v3 (Haswell)\",\"clockSpeed\":\"2.4 GHz\",\"ecu\":\"13\",\"networkPerformance\":\"High\",\"servicename\":\"Amazon Elastic Compute Cloud\",\"instanceType\":\"m4.xlarge\",\"tenancy\":\"Shared\",\"usagetype\":\"EU-BoxUsage:m4.xlarge\",\"normalizationSizeFactor\":\"8\",\"processorFeatures\":\"Intel AVX; Intel AVX2; Intel Turbo\",\"servicecode\":\"AmazonEC2\",\"licenseModel\":\"No License required\",\"currentGeneration\":\"Yes\",\"preInstalledSw\":\"NA\",\"location\":\"EU (Ireland)\",\"processorArchitecture\":\"64-bit\",\"operation\":\"RunInstances:000g\"},\"sku\":\"754M877DFCU5FZVH\"},\"serviceCode\":\"AmazonEC2\",\"terms\":{\"OnDemand\":{\"754M877DFCU5FZVH.JRTCKXETXF\":{\"priceDimensions\":{\"754M877DFCU5FZVH.JRTCKXETXF.6YS6EN2CT7\":{\"unit\":\"Hrs\",\"endRange\":\"Inf\",\"description\":\"$0.322 per On Demand SUSE m4.xlarge Instance Hour\",\"appliesTo\":[],\"rateCode\":\"754M877DFCU5FZVH.JRTCKXETXF.6YS6EN2CT7\",\"beginRange\":\"0\",\"pricePerUnit\":{\"USD\":\"0.3220000000\"}}},\"sku\":\"754M877DFCU5FZVH\",\"effectiveDate\":\"2019-01-01T00:00:00Z\",\"offerTermCode\":\"JRTCKXETXF\",\"termAttributes\":{}}},\"Reserved\":{\"754M877DFCU5FZVH.NQ3QZPMQV9\":{\"priceDimensions\":{\"754M877DFCU5FZVH.NQ3QZPMQV9.2TG2D8R56U\":{\"unit\":\"Quantity\",\"description\":\"Upfront Fee\",\"appliesTo\":[],\"rateCode\":\"754M877DFCU5FZVH.NQ3QZPMQV9.2TG2D8R56U\",\"pricePerUnit\":{\"USD\":\"3164\"}},\"754M877DFCU5FZVH.NQ3QZPMQV9.6YS6EN2CT7\":{\"unit\":\"Hrs\",\"endRange\":\"Inf\",\"description\":\"USD 0.0 per SUSE Linux (Amazon VPC), m4.xlarge reserved instance applied\",\"appliesTo\":[],\"rateCode\":\"754M877DFCU5FZVH.NQ3QZPMQV9.6YS6EN2CT7\",\"beginRange\":\"0\",\"pricePerUnit\":{\"USD\":\"0.0000000000\"}}},\"sku\":\"754M877DFCU5FZVH\",\"effectiveDate\":\"2017-04-30T23:59:59Z\",\"offerTermCode\":\"NQ3QZPMQV9\",\"termAttributes\":{\"LeaseContractLength\":\"3yr\",\"OfferingClass\":\"standard\",\"PurchaseOption\":\"All Upfront\"}},\"754M877DFCU5FZVH.6QCMYABX3D\":{\"priceDimensions\":{\"754M877DFCU5FZVH.6QCMYABX3D.2TG2D8R56U\":{\"unit\":\"Quantity\",\"description\":\"Upfront Fee\",\"appliesTo\":[],\"rateCode\":\"754M877DFCU5FZVH.6QCMYABX3D.2TG2D8R56U\",\"pricePerUnit\":{\"USD\":\"1526\"}},\"754M877DFCU5FZVH.6QCMYABX3D.6YS6EN2CT7\":{\"unit\":\"Hrs\",\"endRange\":\"Inf\",\"description\":\"USD 0.0 per SUSE Linux (Amazon VPC), m4.xlarge reserved instance applied\",\"appliesTo\":[],\"rateCode\":\"754M877DFCU5FZVH.6QCMYABX3D.6YS6EN2CT7\",\"beginRange\":\"0\",\"pricePerUnit\":{\"USD\":\"0.0000000000\"}}},\"sku\":\"754M877DFCU5FZVH\",\"effectiveDate\":\"2017-04-30T23:59:59Z\",\"offerTermCode\":\"6QCMYABX3D\",\"termAttributes\":{\"LeaseContractLength\":\"1yr\",\"OfferingClass\":\"standard\",\"PurchaseOption\":\"All Upfront\"}},\"754M877DFCU5FZVH.BPH4J8HBKS\":{\"priceDimensions\":{\"754M877DFCU5FZVH.BPH4J8HBKS.6YS6EN2CT7\":{\"unit\":\"Hrs\",\"endRange\":\"Inf\",\"description\":\"SUSE Linux (Amazon VPC), m4.xlarge reserved instance applied\",\"appliesTo\":[],\"rateCode\":\"754M877DFCU5FZVH.BPH4J8HBKS.6YS6EN2CT7\",\"beginRange\":\"0\",\"pricePerUnit\":{\"USD\":\"0.1410000000\"}}},\"sku\":\"754M877DFCU5FZVH\",\"effectiveDate\":\"2017-04-30T23:59:59Z\",\"offerTermCode\":\"BPH4J8HBKS\",\"termAttributes\":{\"LeaseContractLength\":\"3yr\",\"OfferingClass\":\"standard\",\"PurchaseOption\":\"No Upfront\"}},\"754M877DFCU5FZVH.HU7G6KETJZ\":{\"priceDimensions\":{\"754M877DFCU5FZVH.HU7G6KETJZ.2TG2D8R56U\":{\"unit\":\"Quantity\",\"description\":\"Upfront Fee\",\"appliesTo\":[],\"rateCode\":\"754M877DFCU5FZVH.HU7G6KETJZ.2TG2D8R56U\",\"pricePerUnit\":{\"USD\":\"807\"}},\"754M877DFCU5FZVH.HU7G6KETJZ.6YS6EN2CT7\":{\"unit\":\"Hrs\",\"endRange\":\"Inf\",\"description\":\"SUSE Linux (Amazon VPC), m4.xlarge reserved instance applied\",\"appliesTo\":[],\"rateCode\":\"754M877DFCU5FZVH.HU7G6KETJZ.6YS6EN2CT7\",\"beginRange\":\"0\",\"pricePerUnit\":{\"USD\":\"0.0850000000\"}}},\"sku\":\"754M877DFCU5FZVH\",\"effectiveDate\":\"2017-04-30T23:59:59Z\",\"offerTermCode\":\"HU7G6KETJZ\",\"termAttributes\":{\"LeaseContractLength\":\"1yr\",\"OfferingClass\":\"standard\",\"PurchaseOption\":\"Partial Upfront\"}},\"754M877DFCU5FZVH.R5XV2EPZQZ\":{\"priceDimensions\":{\"754M877DFCU5FZVH.R5XV2EPZQZ.6YS6EN2CT7\":{\"unit\":\"Hrs\",\"endRange\":\"Inf\",\"description\":\"SUSE Linux (Amazon VPC), m4.xlarge reserved instance applied\",\"appliesTo\":[],\"rateCode\":\"754M877DFCU5FZVH.R5XV2EPZQZ.6YS6EN2CT7\",\"beginRange\":\"0\",\"pricePerUnit\":{\"USD\":\"0.0705000000\"}},\"754M877DFCU5FZVH.R5XV2EPZQZ.2TG2D8R56U\":{\"unit\":\"Quantity\",\"description\":\"Upfront Fee\",\"appliesTo\":[],\"rateCode\":\"754M877DFCU5FZVH.R5XV2EPZQZ.2TG2D8R56U\",\"pricePerUnit\":{\"USD\":\"1863\"}}},\"sku\":\"754M877DFCU5FZVH\",\"effectiveDate\":\"2017-04-30T23:59:59Z\",\"offerTermCode\":\"R5XV2EPZQZ\",\"termAttributes\":{\"LeaseContractLength\":\"3yr\",\"OfferingClass\":\"convertible\",\"PurchaseOption\":\"Partial Upfront\"}},\"754M877DFCU5FZVH.VJWZNREJX2\":{\"priceDimensions\":{\"754M877DFCU5FZVH.VJWZNREJX2.2TG2D8R56U\":{\"unit\":\"Quantity\",\"description\":\"Upfront Fee\",\"appliesTo\":[],\"rateCode\":\"754M877DFCU5FZVH.VJWZNREJX2.2TG2D8R56U\",\"pricePerUnit\":{\"USD\":\"1712\"}},\"754M877DFCU5FZVH.VJWZNREJX2.6YS6EN2CT7\":{\"unit\":\"Hrs\",\"endRange\":\"Inf\",\"description\":\"SUSE Linux (Amazon VPC), m4.xlarge reserved instance applied\",\"appliesTo\":[],\"rateCode\":\"754M877DFCU5FZVH.VJWZNREJX2.6YS6EN2CT7\",\"beginRange\":\"0\",\"pricePerUnit\":{\"USD\":\"0.0000000000\"}}},\"sku\":\"754M877DFCU5FZVH\",\"effectiveDate\":\"2017-10-31T23:59:59Z\",\"offerTermCode\":\"VJWZNREJX2\",\"termAttributes\":{\"LeaseContractLength\":\"1yr\",\"OfferingClass\":\"convertible\",\"PurchaseOption\":\"All Upfront\"}},\"754M877DFCU5FZVH.Z2E3P23VKM\":{\"priceDimensions\":{\"754M877DFCU5FZVH.Z2E3P23VKM.6YS6EN2CT7\":{\"unit\":\"Hrs\",\"endRange\":\"Inf\",\"description\":\"SUSE Linux (Amazon VPC), m4.xlarge reserved instance applied\",\"appliesTo\":[],\"rateCode\":\"754M877DFCU5FZVH.Z2E3P23VKM.6YS6EN2CT7\",\"beginRange\":\"0\",\"pricePerUnit\":{\"USD\":\"0.1572000000\"}}},\"sku\":\"754M877DFCU5FZVH\",\"effectiveDate\":\"2017-04-30T23:59:59Z\",\"offerTermCode\":\"Z2E3P23VKM\",\"termAttributes\":{\"LeaseContractLength\":\"3yr\",\"OfferingClass\":\"convertible\",\"PurchaseOption\":\"No Upfront\"}},\"754M877DFCU5FZVH.CUZHX8X6JH\":{\"priceDimensions\":{\"754M877DFCU5FZVH.CUZHX8X6JH.2TG2D8R56U\":{\"unit\":\"Quantity\",\"description\":\"Upfront Fee\",\"appliesTo\":[],\"rateCode\":\"754M877DFCU5FZVH.CUZHX8X6JH.2TG2D8R56U\",\"pricePerUnit\":{\"USD\":\"901\"}},\"754M877DFCU5FZVH.CUZHX8X6JH.6YS6EN2CT7\":{\"unit\":\"Hrs\",\"endRange\":\"Inf\",\"description\":\"SUSE Linux (Amazon VPC), m4.xlarge reserved instance applied\",\"appliesTo\":[],\"rateCode\":\"754M877DFCU5FZVH.CUZHX8X6JH.6YS6EN2CT7\",\"beginRange\":\"0\",\"pricePerUnit\":{\"USD\":\"0.0958000000\"}}},\"sku\":\"754M877DFCU5FZVH\",\"effectiveDate\":\"2017-10-31T23:59:59Z\",\"offerTermCode\":\"CUZHX8X6JH\",\"termAttributes\":{\"LeaseContractLength\":\"1yr\",\"OfferingClass\":\"convertible\",\"PurchaseOption\":\"Partial Upfront\"}},\"754M877DFCU5FZVH.4NA7Y494T4\":{\"priceDimensions\":{\"754M877DFCU5FZVH.4NA7Y494T4.6YS6EN2CT7\":{\"unit\":\"Hrs\",\"endRange\":\"Inf\",\"description\":\"SUSE Linux (Amazon VPC), m4.xlarge reserved instance applied\",\"appliesTo\":[],\"rateCode\":\"754M877DFCU5FZVH.4NA7Y494T4.6YS6EN2CT7\",\"beginRange\":\"0\",\"pricePerUnit\":{\"USD\":\"0.1842000000\"}}},\"sku\":\"754M877DFCU5FZVH\",\"effectiveDate\":\"2017-04-30T23:59:59Z\",\"offerTermCode\":\"4NA7Y494T4\",\"termAttributes\":{\"LeaseContractLength\":\"1yr\",\"OfferingClass\":\"standard\",\"PurchaseOption\":\"No Upfront\"}},\"754M877DFCU5FZVH.MZU6U2429S\":{\"priceDimensions\":{\"754M877DFCU5FZVH.MZU6U2429S.2TG2D8R56U\":{\"unit\":\"Quantity\",\"description\":\"Upfront Fee\",\"appliesTo\":[],\"rateCode\":\"754M877DFCU5FZVH.MZU6U2429S.2TG2D8R56U\",\"pricePerUnit\":{\"USD\":\"3656\"}},\"754M877DFCU5FZVH.MZU6U2429S.6YS6EN2CT7\":{\"unit\":\"Hrs\",\"endRange\":\"Inf\",\"description\":\"USD 0.0 per SUSE Linux (Amazon VPC), m4.xlarge reserved instance applied\",\"appliesTo\":[],\"rateCode\":\"754M877DFCU5FZVH.MZU6U2429S.6YS6EN2CT7\",\"beginRange\":\"0\",\"pricePerUnit\":{\"USD\":\"0.0000000000\"}}},\"sku\":\"754M877DFCU5FZVH\",\"effectiveDate\":\"2017-04-30T23:59:59Z\",\"offerTermCode\":\"MZU6U2429S\",\"termAttributes\":{\"LeaseContractLength\":\"3yr\",\"OfferingClass\":\"convertible\",\"PurchaseOption\":\"All Upfront\"}},\"754M877DFCU5FZVH.38NPMPTW36\":{\"priceDimensions\":{\"754M877DFCU5FZVH.38NPMPTW36.6YS6EN2CT7\":{\"unit\":\"Hrs\",\"endRange\":\"Inf\",\"description\":\"SUSE Linux (Amazon VPC), m4.xlarge reserved instance applied\",\"appliesTo\":[],\"rateCode\":\"754M877DFCU5FZVH.38NPMPTW36.6YS6EN2CT7\",\"beginRange\":\"0\",\"pricePerUnit\":{\"USD\":\"0.0630000000\"}},\"754M877DFCU5FZVH.38NPMPTW36.2TG2D8R56U\":{\"unit\":\"Quantity\",\"description\":\"Upfront Fee\",\"appliesTo\":[],\"rateCode\":\"754M877DFCU5FZVH.38NPMPTW36.2TG2D8R56U\",\"pricePerUnit\":{\"USD\":\"1666\"}}},\"sku\":\"754M877DFCU5FZVH\",\"effectiveDate\":\"2017-04-30T23:59:59Z\",\"offerTermCode\":\"38NPMPTW36\",\"termAttributes\":{\"LeaseContractLength\":\"3yr\",\"OfferingClass\":\"standard\",\"PurchaseOption\":\"Partial Upfront\"}},\"754M877DFCU5FZVH.7NE97W5U4E\":{\"priceDimensions\":{\"754M877DFCU5FZVH.7NE97W5U4E.6YS6EN2CT7\":{\"unit\":\"Hrs\",\"endRange\":\"Inf\",\"description\":\"SUSE Linux (Amazon VPC), m4.xlarge reserved instance applied\",\"appliesTo\":[],\"rateCode\":\"754M877DFCU5FZVH.7NE97W5U4E.6YS6EN2CT7\",\"beginRange\":\"0\",\"pricePerUnit\":{\"USD\":\"0.2069000000\"}}},\"sku\":\"754M877DFCU5FZVH\",\"effectiveDate\":\"2017-10-31T23:59:59Z\",\"offerTermCode\":\"7NE97W5U4E\",\"termAttributes\":{\"LeaseContractLength\":\"1yr\",\"OfferingClass\":\"convertible\",\"PurchaseOption\":\"No Upfront\"}}}},\"version\":\"20190116212448\",\"publicationDate\":\"2019-01-16T21:24:48Z\"}", + "{\"product\":{\"productFamily\":\"Compute Instance\",\"attributes\":{\"enhancedNetworkingSupported\":\"Yes\",\"memory\":\"16 GiB\",\"dedicatedEbsThroughput\":\"750 Mbps\",\"vcpu\":\"4\",\"capacitystatus\":\"Used\",\"locationType\":\"AWS Region\",\"storage\":\"EBS only\",\"instanceFamily\":\"General purpose\",\"operatingSystem\":\"Windows\",\"physicalProcessor\":\"Intel Xeon E5-2676 v3 (Haswell)\",\"clockSpeed\":\"2.4 GHz\",\"ecu\":\"13\",\"networkPerformance\":\"High\",\"servicename\":\"Amazon Elastic Compute Cloud\",\"instanceType\":\"m4.xlarge\",\"tenancy\":\"Shared\",\"usagetype\":\"EU-BoxUsage:m4.xlarge\",\"normalizationSizeFactor\":\"8\",\"processorFeatures\":\"Intel AVX; Intel AVX2; Intel Turbo\",\"servicecode\":\"AmazonEC2\",\"licenseModel\":\"Bring your own license\",\"currentGeneration\":\"Yes\",\"preInstalledSw\":\"NA\",\"location\":\"EU (Ireland)\",\"processorArchitecture\":\"64-bit\",\"operation\":\"RunInstances:0800\"},\"sku\":\"78748EQZN4RZFXG8\"},\"serviceCode\":\"AmazonEC2\",\"terms\":{\"OnDemand\":{\"78748EQZN4RZFXG8.JRTCKXETXF\":{\"priceDimensions\":{\"78748EQZN4RZFXG8.JRTCKXETXF.6YS6EN2CT7\":{\"unit\":\"Hrs\",\"endRange\":\"Inf\",\"description\":\"$0.222 per On Demand Windows BYOL m4.xlarge Instance Hour\",\"appliesTo\":[],\"rateCode\":\"78748EQZN4RZFXG8.JRTCKXETXF.6YS6EN2CT7\",\"beginRange\":\"0\",\"pricePerUnit\":{\"USD\":\"0.2220000000\"}}},\"sku\":\"78748EQZN4RZFXG8\",\"effectiveDate\":\"2019-01-01T00:00:00Z\",\"offerTermCode\":\"JRTCKXETXF\",\"termAttributes\":{}}}},\"version\":\"20190116212448\",\"publicationDate\":\"2019-01-16T21:24:48Z\"}", + "{\"product\":{\"productFamily\":\"Compute Instance\",\"attributes\":{\"enhancedNetworkingSupported\":\"Yes\",\"memory\":\"16 GiB\",\"dedicatedEbsThroughput\":\"750 Mbps\",\"vcpu\":\"4\",\"capacitystatus\":\"Used\",\"locationType\":\"AWS Region\",\"storage\":\"EBS only\",\"instanceFamily\":\"General purpose\",\"operatingSystem\":\"Linux\",\"physicalProcessor\":\"Intel Xeon E5-2676 v3 (Haswell)\",\"clockSpeed\":\"2.4 GHz\",\"ecu\":\"13\",\"networkPerformance\":\"High\",\"servicename\":\"Amazon Elastic Compute Cloud\",\"instanceType\":\"m4.xlarge\",\"tenancy\":\"Host\",\"usagetype\":\"EU-HostBoxUsage:m4.xlarge\",\"normalizationSizeFactor\":\"8\",\"processorFeatures\":\"Intel AVX; Intel AVX2; Intel Turbo\",\"servicecode\":\"AmazonEC2\",\"licenseModel\":\"No License required\",\"currentGeneration\":\"Yes\",\"preInstalledSw\":\"NA\",\"location\":\"EU (Ireland)\",\"processorArchitecture\":\"64-bit\",\"operation\":\"RunInstances\"},\"sku\":\"8JTZ8Y4FN6FSFDJ7\"},\"serviceCode\":\"AmazonEC2\",\"terms\":{\"OnDemand\":{\"8JTZ8Y4FN6FSFDJ7.JRTCKXETXF\":{\"priceDimensions\":{\"8JTZ8Y4FN6FSFDJ7.JRTCKXETXF.6YS6EN2CT7\":{\"unit\":\"Hrs\",\"endRange\":\"Inf\",\"description\":\"$0.000 per Linux m4.xlarge Dedicated Host Instance hour\",\"appliesTo\":[],\"rateCode\":\"8JTZ8Y4FN6FSFDJ7.JRTCKXETXF.6YS6EN2CT7\",\"beginRange\":\"0\",\"pricePerUnit\":{\"USD\":\"0.0000000000\"}}},\"sku\":\"8JTZ8Y4FN6FSFDJ7\",\"effectiveDate\":\"2019-01-01T00:00:00Z\",\"offerTermCode\":\"JRTCKXETXF\",\"termAttributes\":{}}}},\"version\":\"20190116212448\",\"publicationDate\":\"2019-01-16T21:24:48Z\"}", + "{\"product\":{\"productFamily\":\"Compute Instance\",\"attributes\":{\"enhancedNetworkingSupported\":\"Yes\",\"memory\":\"16 GiB\",\"dedicatedEbsThroughput\":\"750 Mbps\",\"vcpu\":\"4\",\"capacitystatus\":\"Used\",\"locationType\":\"AWS Region\",\"storage\":\"EBS only\",\"instanceFamily\":\"General purpose\",\"operatingSystem\":\"Windows\",\"physicalProcessor\":\"Intel Xeon E5-2676 v3 (Haswell)\",\"clockSpeed\":\"2.4 GHz\",\"ecu\":\"13\",\"networkPerformance\":\"High\",\"servicename\":\"Amazon Elastic Compute Cloud\",\"instanceType\":\"m4.xlarge\",\"tenancy\":\"Host\",\"usagetype\":\"EU-HostBoxUsage:m4.xlarge\",\"normalizationSizeFactor\":\"8\",\"processorFeatures\":\"Intel AVX; Intel AVX2; Intel Turbo\",\"servicecode\":\"AmazonEC2\",\"licenseModel\":\"No License required\",\"currentGeneration\":\"Yes\",\"preInstalledSw\":\"NA\",\"location\":\"EU (Ireland)\",\"processorArchitecture\":\"64-bit\",\"operation\":\"RunInstances:0002\"},\"sku\":\"A4392DXX8HZVKB96\"},\"serviceCode\":\"AmazonEC2\",\"terms\":{\"OnDemand\":{\"A4392DXX8HZVKB96.JRTCKXETXF\":{\"priceDimensions\":{\"A4392DXX8HZVKB96.JRTCKXETXF.6YS6EN2CT7\":{\"unit\":\"Hrs\",\"endRange\":\"Inf\",\"description\":\"$0.000 per Windows m4.xlarge Dedicated Host Instance hour\",\"appliesTo\":[],\"rateCode\":\"A4392DXX8HZVKB96.JRTCKXETXF.6YS6EN2CT7\",\"beginRange\":\"0\",\"pricePerUnit\":{\"USD\":\"0.0000000000\"}}},\"sku\":\"A4392DXX8HZVKB96\",\"effectiveDate\":\"2019-01-01T00:00:00Z\",\"offerTermCode\":\"JRTCKXETXF\",\"termAttributes\":{}}}},\"version\":\"20190116212448\",\"publicationDate\":\"2019-01-16T21:24:48Z\"}", + "{\"product\":{\"productFamily\":\"Compute Instance\",\"attributes\":{\"enhancedNetworkingSupported\":\"Yes\",\"memory\":\"16 GiB\",\"dedicatedEbsThroughput\":\"750 Mbps\",\"vcpu\":\"4\",\"capacitystatus\":\"Used\",\"locationType\":\"AWS Region\",\"storage\":\"EBS only\",\"instanceFamily\":\"General purpose\",\"operatingSystem\":\"SUSE\",\"physicalProcessor\":\"Intel Xeon E5-2676 v3 (Haswell)\",\"clockSpeed\":\"2.4 GHz\",\"ecu\":\"13\",\"networkPerformance\":\"High\",\"servicename\":\"Amazon Elastic Compute Cloud\",\"instanceType\":\"m4.xlarge\",\"tenancy\":\"Dedicated\",\"usagetype\":\"EU-DedicatedUsage:m4.xlarge\",\"normalizationSizeFactor\":\"8\",\"processorFeatures\":\"Intel AVX; Intel AVX2; Intel Turbo\",\"servicecode\":\"AmazonEC2\",\"licenseModel\":\"No License required\",\"currentGeneration\":\"Yes\",\"preInstalledSw\":\"NA\",\"location\":\"EU (Ireland)\",\"processorArchitecture\":\"64-bit\",\"operation\":\"RunInstances:000g\"},\"sku\":\"E2GJSF2Y4VK3UTJX\"},\"serviceCode\":\"AmazonEC2\",\"terms\":{\"OnDemand\":{\"E2GJSF2Y4VK3UTJX.JRTCKXETXF\":{\"priceDimensions\":{\"E2GJSF2Y4VK3UTJX.JRTCKXETXF.6YS6EN2CT7\":{\"unit\":\"Hrs\",\"endRange\":\"Inf\",\"description\":\"$0.3442 per Dedicated SUSE m4.xlarge Instance Hour\",\"appliesTo\":[],\"rateCode\":\"E2GJSF2Y4VK3UTJX.JRTCKXETXF.6YS6EN2CT7\",\"beginRange\":\"0\",\"pricePerUnit\":{\"USD\":\"0.3442000000\"}}},\"sku\":\"E2GJSF2Y4VK3UTJX\",\"effectiveDate\":\"2019-01-01T00:00:00Z\",\"offerTermCode\":\"JRTCKXETXF\",\"termAttributes\":{}}},\"Reserved\":{\"E2GJSF2Y4VK3UTJX.7NE97W5U4E\":{\"priceDimensions\":{\"E2GJSF2Y4VK3UTJX.7NE97W5U4E.6YS6EN2CT7\":{\"unit\":\"Hrs\",\"endRange\":\"Inf\",\"description\":\"SUSE Linux (Amazon VPC), m4.xlarge reserved instance applied\",\"appliesTo\":[],\"rateCode\":\"E2GJSF2Y4VK3UTJX.7NE97W5U4E.6YS6EN2CT7\",\"beginRange\":\"0\",\"pricePerUnit\":{\"USD\":\"0.2243000000\"}}},\"sku\":\"E2GJSF2Y4VK3UTJX\",\"effectiveDate\":\"2017-10-31T23:59:59Z\",\"offerTermCode\":\"7NE97W5U4E\",\"termAttributes\":{\"LeaseContractLength\":\"1yr\",\"OfferingClass\":\"convertible\",\"PurchaseOption\":\"No Upfront\"}},\"E2GJSF2Y4VK3UTJX.HU7G6KETJZ\":{\"priceDimensions\":{\"E2GJSF2Y4VK3UTJX.HU7G6KETJZ.2TG2D8R56U\":{\"unit\":\"Quantity\",\"description\":\"Upfront Fee\",\"appliesTo\":[],\"rateCode\":\"E2GJSF2Y4VK3UTJX.HU7G6KETJZ.2TG2D8R56U\",\"pricePerUnit\":{\"USD\":\"870\"}},\"E2GJSF2Y4VK3UTJX.HU7G6KETJZ.6YS6EN2CT7\":{\"unit\":\"Hrs\",\"endRange\":\"Inf\",\"description\":\"SUSE Linux (Amazon VPC), m4.xlarge reserved instance applied\",\"appliesTo\":[],\"rateCode\":\"E2GJSF2Y4VK3UTJX.HU7G6KETJZ.6YS6EN2CT7\",\"beginRange\":\"0\",\"pricePerUnit\":{\"USD\":\"0.0922000000\"}}},\"sku\":\"E2GJSF2Y4VK3UTJX\",\"effectiveDate\":\"2017-04-30T23:59:59Z\",\"offerTermCode\":\"HU7G6KETJZ\",\"termAttributes\":{\"LeaseContractLength\":\"1yr\",\"OfferingClass\":\"standard\",\"PurchaseOption\":\"Partial Upfront\"}},\"E2GJSF2Y4VK3UTJX.CUZHX8X6JH\":{\"priceDimensions\":{\"E2GJSF2Y4VK3UTJX.CUZHX8X6JH.6YS6EN2CT7\":{\"unit\":\"Hrs\",\"endRange\":\"Inf\",\"description\":\"SUSE Linux (Amazon VPC), m4.xlarge reserved instance applied\",\"appliesTo\":[],\"rateCode\":\"E2GJSF2Y4VK3UTJX.CUZHX8X6JH.6YS6EN2CT7\",\"beginRange\":\"0\",\"pricePerUnit\":{\"USD\":\"0.1041000000\"}},\"E2GJSF2Y4VK3UTJX.CUZHX8X6JH.2TG2D8R56U\":{\"unit\":\"Quantity\",\"description\":\"Upfront Fee\",\"appliesTo\":[],\"rateCode\":\"E2GJSF2Y4VK3UTJX.CUZHX8X6JH.2TG2D8R56U\",\"pricePerUnit\":{\"USD\":\"974\"}}},\"sku\":\"E2GJSF2Y4VK3UTJX\",\"effectiveDate\":\"2017-10-31T23:59:59Z\",\"offerTermCode\":\"CUZHX8X6JH\",\"termAttributes\":{\"LeaseContractLength\":\"1yr\",\"OfferingClass\":\"convertible\",\"PurchaseOption\":\"Partial Upfront\"}},\"E2GJSF2Y4VK3UTJX.4NA7Y494T4\":{\"priceDimensions\":{\"E2GJSF2Y4VK3UTJX.4NA7Y494T4.6YS6EN2CT7\":{\"unit\":\"Hrs\",\"endRange\":\"Inf\",\"description\":\"SUSE Linux (Amazon VPC), m4.xlarge reserved instance applied\",\"appliesTo\":[],\"rateCode\":\"E2GJSF2Y4VK3UTJX.4NA7Y494T4.6YS6EN2CT7\",\"beginRange\":\"0\",\"pricePerUnit\":{\"USD\":\"0.1993000000\"}}},\"sku\":\"E2GJSF2Y4VK3UTJX\",\"effectiveDate\":\"2017-04-30T23:59:59Z\",\"offerTermCode\":\"4NA7Y494T4\",\"termAttributes\":{\"LeaseContractLength\":\"1yr\",\"OfferingClass\":\"standard\",\"PurchaseOption\":\"No Upfront\"}},\"E2GJSF2Y4VK3UTJX.VJWZNREJX2\":{\"priceDimensions\":{\"E2GJSF2Y4VK3UTJX.VJWZNREJX2.2TG2D8R56U\":{\"unit\":\"Quantity\",\"description\":\"Upfront Fee\",\"appliesTo\":[],\"rateCode\":\"E2GJSF2Y4VK3UTJX.VJWZNREJX2.2TG2D8R56U\",\"pricePerUnit\":{\"USD\":\"1854\"}},\"E2GJSF2Y4VK3UTJX.VJWZNREJX2.6YS6EN2CT7\":{\"unit\":\"Hrs\",\"endRange\":\"Inf\",\"description\":\"SUSE Linux (Amazon VPC), m4.xlarge reserved instance applied\",\"appliesTo\":[],\"rateCode\":\"E2GJSF2Y4VK3UTJX.VJWZNREJX2.6YS6EN2CT7\",\"beginRange\":\"0\",\"pricePerUnit\":{\"USD\":\"0.0000000000\"}}},\"sku\":\"E2GJSF2Y4VK3UTJX\",\"effectiveDate\":\"2017-10-31T23:59:59Z\",\"offerTermCode\":\"VJWZNREJX2\",\"termAttributes\":{\"LeaseContractLength\":\"1yr\",\"OfferingClass\":\"convertible\",\"PurchaseOption\":\"All Upfront\"}},\"E2GJSF2Y4VK3UTJX.MZU6U2429S\":{\"priceDimensions\":{\"E2GJSF2Y4VK3UTJX.MZU6U2429S.6YS6EN2CT7\":{\"unit\":\"Hrs\",\"endRange\":\"Inf\",\"description\":\"USD 0.0 per SUSE Linux (Amazon VPC), m4.xlarge reserved instance applied\",\"appliesTo\":[],\"rateCode\":\"E2GJSF2Y4VK3UTJX.MZU6U2429S.6YS6EN2CT7\",\"beginRange\":\"0\",\"pricePerUnit\":{\"USD\":\"0.0000000000\"}},\"E2GJSF2Y4VK3UTJX.MZU6U2429S.2TG2D8R56U\":{\"unit\":\"Quantity\",\"description\":\"Upfront Fee\",\"appliesTo\":[],\"rateCode\":\"E2GJSF2Y4VK3UTJX.MZU6U2429S.2TG2D8R56U\",\"pricePerUnit\":{\"USD\":\"3952\"}}},\"sku\":\"E2GJSF2Y4VK3UTJX\",\"effectiveDate\":\"2017-04-30T23:59:59Z\",\"offerTermCode\":\"MZU6U2429S\",\"termAttributes\":{\"LeaseContractLength\":\"3yr\",\"OfferingClass\":\"convertible\",\"PurchaseOption\":\"All Upfront\"}},\"E2GJSF2Y4VK3UTJX.R5XV2EPZQZ\":{\"priceDimensions\":{\"E2GJSF2Y4VK3UTJX.R5XV2EPZQZ.2TG2D8R56U\":{\"unit\":\"Quantity\",\"description\":\"Upfront Fee\",\"appliesTo\":[],\"rateCode\":\"E2GJSF2Y4VK3UTJX.R5XV2EPZQZ.2TG2D8R56U\",\"pricePerUnit\":{\"USD\":\"2014\"}},\"E2GJSF2Y4VK3UTJX.R5XV2EPZQZ.6YS6EN2CT7\":{\"unit\":\"Hrs\",\"endRange\":\"Inf\",\"description\":\"SUSE Linux (Amazon VPC), m4.xlarge reserved instance applied\",\"appliesTo\":[],\"rateCode\":\"E2GJSF2Y4VK3UTJX.R5XV2EPZQZ.6YS6EN2CT7\",\"beginRange\":\"0\",\"pricePerUnit\":{\"USD\":\"0.0763000000\"}}},\"sku\":\"E2GJSF2Y4VK3UTJX\",\"effectiveDate\":\"2017-04-30T23:59:59Z\",\"offerTermCode\":\"R5XV2EPZQZ\",\"termAttributes\":{\"LeaseContractLength\":\"3yr\",\"OfferingClass\":\"convertible\",\"PurchaseOption\":\"Partial Upfront\"}},\"E2GJSF2Y4VK3UTJX.NQ3QZPMQV9\":{\"priceDimensions\":{\"E2GJSF2Y4VK3UTJX.NQ3QZPMQV9.6YS6EN2CT7\":{\"unit\":\"Hrs\",\"endRange\":\"Inf\",\"description\":\"USD 0.0 per SUSE Linux (Amazon VPC), m4.xlarge reserved instance applied\",\"appliesTo\":[],\"rateCode\":\"E2GJSF2Y4VK3UTJX.NQ3QZPMQV9.6YS6EN2CT7\",\"beginRange\":\"0\",\"pricePerUnit\":{\"USD\":\"0.0000000000\"}},\"E2GJSF2Y4VK3UTJX.NQ3QZPMQV9.2TG2D8R56U\":{\"unit\":\"Quantity\",\"description\":\"Upfront Fee\",\"appliesTo\":[],\"rateCode\":\"E2GJSF2Y4VK3UTJX.NQ3QZPMQV9.2TG2D8R56U\",\"pricePerUnit\":{\"USD\":\"3411\"}}},\"sku\":\"E2GJSF2Y4VK3UTJX\",\"effectiveDate\":\"2017-04-30T23:59:59Z\",\"offerTermCode\":\"NQ3QZPMQV9\",\"termAttributes\":{\"LeaseContractLength\":\"3yr\",\"OfferingClass\":\"standard\",\"PurchaseOption\":\"All Upfront\"}},\"E2GJSF2Y4VK3UTJX.BPH4J8HBKS\":{\"priceDimensions\":{\"E2GJSF2Y4VK3UTJX.BPH4J8HBKS.6YS6EN2CT7\":{\"unit\":\"Hrs\",\"endRange\":\"Inf\",\"description\":\"SUSE Linux (Amazon VPC), m4.xlarge reserved instance applied\",\"appliesTo\":[],\"rateCode\":\"E2GJSF2Y4VK3UTJX.BPH4J8HBKS.6YS6EN2CT7\",\"beginRange\":\"0\",\"pricePerUnit\":{\"USD\":\"0.1518000000\"}}},\"sku\":\"E2GJSF2Y4VK3UTJX\",\"effectiveDate\":\"2017-04-30T23:59:59Z\",\"offerTermCode\":\"BPH4J8HBKS\",\"termAttributes\":{\"LeaseContractLength\":\"3yr\",\"OfferingClass\":\"standard\",\"PurchaseOption\":\"No Upfront\"}},\"E2GJSF2Y4VK3UTJX.Z2E3P23VKM\":{\"priceDimensions\":{\"E2GJSF2Y4VK3UTJX.Z2E3P23VKM.6YS6EN2CT7\":{\"unit\":\"Hrs\",\"endRange\":\"Inf\",\"description\":\"SUSE Linux (Amazon VPC), m4.xlarge reserved instance applied\",\"appliesTo\":[],\"rateCode\":\"E2GJSF2Y4VK3UTJX.Z2E3P23VKM.6YS6EN2CT7\",\"beginRange\":\"0\",\"pricePerUnit\":{\"USD\":\"0.1696000000\"}}},\"sku\":\"E2GJSF2Y4VK3UTJX\",\"effectiveDate\":\"2017-04-30T23:59:59Z\",\"offerTermCode\":\"Z2E3P23VKM\",\"termAttributes\":{\"LeaseContractLength\":\"3yr\",\"OfferingClass\":\"convertible\",\"PurchaseOption\":\"No Upfront\"}},\"E2GJSF2Y4VK3UTJX.38NPMPTW36\":{\"priceDimensions\":{\"E2GJSF2Y4VK3UTJX.38NPMPTW36.2TG2D8R56U\":{\"unit\":\"Quantity\",\"description\":\"Upfront Fee\",\"appliesTo\":[],\"rateCode\":\"E2GJSF2Y4VK3UTJX.38NPMPTW36.2TG2D8R56U\",\"pricePerUnit\":{\"USD\":\"1797\"}},\"E2GJSF2Y4VK3UTJX.38NPMPTW36.6YS6EN2CT7\":{\"unit\":\"Hrs\",\"endRange\":\"Inf\",\"description\":\"SUSE Linux (Amazon VPC), m4.xlarge reserved instance applied\",\"appliesTo\":[],\"rateCode\":\"E2GJSF2Y4VK3UTJX.38NPMPTW36.6YS6EN2CT7\",\"beginRange\":\"0\",\"pricePerUnit\":{\"USD\":\"0.0680000000\"}}},\"sku\":\"E2GJSF2Y4VK3UTJX\",\"effectiveDate\":\"2017-04-30T23:59:59Z\",\"offerTermCode\":\"38NPMPTW36\",\"termAttributes\":{\"LeaseContractLength\":\"3yr\",\"OfferingClass\":\"standard\",\"PurchaseOption\":\"Partial Upfront\"}},\"E2GJSF2Y4VK3UTJX.6QCMYABX3D\":{\"priceDimensions\":{\"E2GJSF2Y4VK3UTJX.6QCMYABX3D.6YS6EN2CT7\":{\"unit\":\"Hrs\",\"endRange\":\"Inf\",\"description\":\"USD 0.0 per SUSE Linux (Amazon VPC), m4.xlarge reserved instance applied\",\"appliesTo\":[],\"rateCode\":\"E2GJSF2Y4VK3UTJX.6QCMYABX3D.6YS6EN2CT7\",\"beginRange\":\"0\",\"pricePerUnit\":{\"USD\":\"0.0000000000\"}},\"E2GJSF2Y4VK3UTJX.6QCMYABX3D.2TG2D8R56U\":{\"unit\":\"Quantity\",\"description\":\"Upfront Fee\",\"appliesTo\":[],\"rateCode\":\"E2GJSF2Y4VK3UTJX.6QCMYABX3D.2TG2D8R56U\",\"pricePerUnit\":{\"USD\":\"1650\"}}},\"sku\":\"E2GJSF2Y4VK3UTJX\",\"effectiveDate\":\"2017-04-30T23:59:59Z\",\"offerTermCode\":\"6QCMYABX3D\",\"termAttributes\":{\"LeaseContractLength\":\"1yr\",\"OfferingClass\":\"standard\",\"PurchaseOption\":\"All Upfront\"}}}},\"version\":\"20190116212448\",\"publicationDate\":\"2019-01-16T21:24:48Z\"}", + "{\"product\":{\"productFamily\":\"Compute Instance\",\"attributes\":{\"enhancedNetworkingSupported\":\"Yes\",\"memory\":\"16 GiB\",\"dedicatedEbsThroughput\":\"750 Mbps\",\"vcpu\":\"4\",\"capacitystatus\":\"Used\",\"locationType\":\"AWS Region\",\"storage\":\"EBS only\",\"instanceFamily\":\"General purpose\",\"operatingSystem\":\"Windows\",\"physicalProcessor\":\"Intel Xeon E5-2676 v3 (Haswell)\",\"clockSpeed\":\"2.4 GHz\",\"ecu\":\"13\",\"networkPerformance\":\"High\",\"servicename\":\"Amazon Elastic Compute Cloud\",\"instanceType\":\"m4.xlarge\",\"tenancy\":\"Dedicated\",\"usagetype\":\"EU-DedicatedUsage:m4.xlarge\",\"normalizationSizeFactor\":\"8\",\"processorFeatures\":\"Intel AVX; Intel AVX2; Intel Turbo\",\"servicecode\":\"AmazonEC2\",\"licenseModel\":\"Bring your own license\",\"currentGeneration\":\"Yes\",\"preInstalledSw\":\"NA\",\"location\":\"EU (Ireland)\",\"processorArchitecture\":\"64-bit\",\"operation\":\"RunInstances:0800\"},\"sku\":\"EAE5U4TVXNVU7KUW\"},\"serviceCode\":\"AmazonEC2\",\"terms\":{\"OnDemand\":{\"EAE5U4TVXNVU7KUW.JRTCKXETXF\":{\"priceDimensions\":{\"EAE5U4TVXNVU7KUW.JRTCKXETXF.6YS6EN2CT7\":{\"unit\":\"Hrs\",\"endRange\":\"Inf\",\"description\":\"$0.2442 per Dedicated Windows BYOL m4.xlarge Instance Hour\",\"appliesTo\":[],\"rateCode\":\"EAE5U4TVXNVU7KUW.JRTCKXETXF.6YS6EN2CT7\",\"beginRange\":\"0\",\"pricePerUnit\":{\"USD\":\"0.2442000000\"}}},\"sku\":\"EAE5U4TVXNVU7KUW\",\"effectiveDate\":\"2019-01-01T00:00:00Z\",\"offerTermCode\":\"JRTCKXETXF\",\"termAttributes\":{}}}},\"version\":\"20190116212448\",\"publicationDate\":\"2019-01-16T21:24:48Z\"}", + "{\"product\":{\"productFamily\":\"Compute Instance\",\"attributes\":{\"enhancedNetworkingSupported\":\"Yes\",\"memory\":\"16 GiB\",\"dedicatedEbsThroughput\":\"750 Mbps\",\"vcpu\":\"4\",\"capacitystatus\":\"Used\",\"locationType\":\"AWS Region\",\"storage\":\"EBS only\",\"instanceFamily\":\"General purpose\",\"operatingSystem\":\"RHEL\",\"physicalProcessor\":\"Intel Xeon E5-2676 v3 (Haswell)\",\"clockSpeed\":\"2.4 GHz\",\"ecu\":\"13\",\"networkPerformance\":\"High\",\"servicename\":\"Amazon Elastic Compute Cloud\",\"instanceType\":\"m4.xlarge\",\"tenancy\":\"Dedicated\",\"usagetype\":\"EU-DedicatedUsage:m4.xlarge\",\"normalizationSizeFactor\":\"8\",\"processorFeatures\":\"Intel AVX; Intel AVX2; Intel Turbo\",\"servicecode\":\"AmazonEC2\",\"licenseModel\":\"No License required\",\"currentGeneration\":\"Yes\",\"preInstalledSw\":\"NA\",\"location\":\"EU (Ireland)\",\"processorArchitecture\":\"64-bit\",\"operation\":\"RunInstances:0010\"},\"sku\":\"H4U3243366KVUYPJ\"},\"serviceCode\":\"AmazonEC2\",\"terms\":{\"OnDemand\":{\"H4U3243366KVUYPJ.JRTCKXETXF\":{\"priceDimensions\":{\"H4U3243366KVUYPJ.JRTCKXETXF.6YS6EN2CT7\":{\"unit\":\"Hrs\",\"endRange\":\"Inf\",\"description\":\"$0.3042 per Dedicated RHEL m4.xlarge Instance Hour\",\"appliesTo\":[],\"rateCode\":\"H4U3243366KVUYPJ.JRTCKXETXF.6YS6EN2CT7\",\"beginRange\":\"0\",\"pricePerUnit\":{\"USD\":\"0.3042000000\"}}},\"sku\":\"H4U3243366KVUYPJ\",\"effectiveDate\":\"2019-01-01T00:00:00Z\",\"offerTermCode\":\"JRTCKXETXF\",\"termAttributes\":{}}},\"Reserved\":{\"H4U3243366KVUYPJ.4NA7Y494T4\":{\"priceDimensions\":{\"H4U3243366KVUYPJ.4NA7Y494T4.6YS6EN2CT7\":{\"unit\":\"Hrs\",\"endRange\":\"Inf\",\"description\":\"Red Hat Enterprise Linux (Amazon VPC), m4.xlarge reserved instance applied\",\"appliesTo\":[],\"rateCode\":\"H4U3243366KVUYPJ.4NA7Y494T4.6YS6EN2CT7\",\"beginRange\":\"0\",\"pricePerUnit\":{\"USD\":\"0.2263000000\"}}},\"sku\":\"H4U3243366KVUYPJ\",\"effectiveDate\":\"2017-04-30T23:59:59Z\",\"offerTermCode\":\"4NA7Y494T4\",\"termAttributes\":{\"LeaseContractLength\":\"1yr\",\"OfferingClass\":\"standard\",\"PurchaseOption\":\"No Upfront\"}},\"H4U3243366KVUYPJ.38NPMPTW36\":{\"priceDimensions\":{\"H4U3243366KVUYPJ.38NPMPTW36.6YS6EN2CT7\":{\"unit\":\"Hrs\",\"endRange\":\"Inf\",\"description\":\"Red Hat Enterprise Linux (Amazon VPC), m4.xlarge reserved instance applied\",\"appliesTo\":[],\"rateCode\":\"H4U3243366KVUYPJ.38NPMPTW36.6YS6EN2CT7\",\"beginRange\":\"0\",\"pricePerUnit\":{\"USD\":\"0.1150000000\"}},\"H4U3243366KVUYPJ.38NPMPTW36.2TG2D8R56U\":{\"unit\":\"Quantity\",\"description\":\"Upfront Fee\",\"appliesTo\":[],\"rateCode\":\"H4U3243366KVUYPJ.38NPMPTW36.2TG2D8R56U\",\"pricePerUnit\":{\"USD\":\"1445\"}}},\"sku\":\"H4U3243366KVUYPJ\",\"effectiveDate\":\"2017-04-30T23:59:59Z\",\"offerTermCode\":\"38NPMPTW36\",\"termAttributes\":{\"LeaseContractLength\":\"3yr\",\"OfferingClass\":\"standard\",\"PurchaseOption\":\"Partial Upfront\"}},\"H4U3243366KVUYPJ.MZU6U2429S\":{\"priceDimensions\":{\"H4U3243366KVUYPJ.MZU6U2429S.2TG2D8R56U\":{\"unit\":\"Quantity\",\"description\":\"Upfront Fee\",\"appliesTo\":[],\"rateCode\":\"H4U3243366KVUYPJ.MZU6U2429S.2TG2D8R56U\",\"pricePerUnit\":{\"USD\":\"4835\"}},\"H4U3243366KVUYPJ.MZU6U2429S.6YS6EN2CT7\":{\"unit\":\"Hrs\",\"endRange\":\"Inf\",\"description\":\"USD 0.0 per Red Hat Enterprise Linux (Amazon VPC), m4.xlarge reserved instance applied\",\"appliesTo\":[],\"rateCode\":\"H4U3243366KVUYPJ.MZU6U2429S.6YS6EN2CT7\",\"beginRange\":\"0\",\"pricePerUnit\":{\"USD\":\"0.0000000000\"}}},\"sku\":\"H4U3243366KVUYPJ\",\"effectiveDate\":\"2017-04-30T23:59:59Z\",\"offerTermCode\":\"MZU6U2429S\",\"termAttributes\":{\"LeaseContractLength\":\"3yr\",\"OfferingClass\":\"convertible\",\"PurchaseOption\":\"All Upfront\"}},\"H4U3243366KVUYPJ.R5XV2EPZQZ\":{\"priceDimensions\":{\"H4U3243366KVUYPJ.R5XV2EPZQZ.2TG2D8R56U\":{\"unit\":\"Quantity\",\"description\":\"Upfront Fee\",\"appliesTo\":[],\"rateCode\":\"H4U3243366KVUYPJ.R5XV2EPZQZ.2TG2D8R56U\",\"pricePerUnit\":{\"USD\":\"1662\"}},\"H4U3243366KVUYPJ.R5XV2EPZQZ.6YS6EN2CT7\":{\"unit\":\"Hrs\",\"endRange\":\"Inf\",\"description\":\"Red Hat Enterprise Linux (Amazon VPC), m4.xlarge reserved instance applied\",\"appliesTo\":[],\"rateCode\":\"H4U3243366KVUYPJ.R5XV2EPZQZ.6YS6EN2CT7\",\"beginRange\":\"0\",\"pricePerUnit\":{\"USD\":\"0.1233000000\"}}},\"sku\":\"H4U3243366KVUYPJ\",\"effectiveDate\":\"2017-04-30T23:59:59Z\",\"offerTermCode\":\"R5XV2EPZQZ\",\"termAttributes\":{\"LeaseContractLength\":\"3yr\",\"OfferingClass\":\"convertible\",\"PurchaseOption\":\"Partial Upfront\"}},\"H4U3243366KVUYPJ.BPH4J8HBKS\":{\"priceDimensions\":{\"H4U3243366KVUYPJ.BPH4J8HBKS.6YS6EN2CT7\":{\"unit\":\"Hrs\",\"endRange\":\"Inf\",\"description\":\"Red Hat Enterprise Linux (Amazon VPC), m4.xlarge reserved instance applied\",\"appliesTo\":[],\"rateCode\":\"H4U3243366KVUYPJ.BPH4J8HBKS.6YS6EN2CT7\",\"beginRange\":\"0\",\"pricePerUnit\":{\"USD\":\"0.1788000000\"}}},\"sku\":\"H4U3243366KVUYPJ\",\"effectiveDate\":\"2017-04-30T23:59:59Z\",\"offerTermCode\":\"BPH4J8HBKS\",\"termAttributes\":{\"LeaseContractLength\":\"3yr\",\"OfferingClass\":\"standard\",\"PurchaseOption\":\"No Upfront\"}},\"H4U3243366KVUYPJ.CUZHX8X6JH\":{\"priceDimensions\":{\"H4U3243366KVUYPJ.CUZHX8X6JH.6YS6EN2CT7\":{\"unit\":\"Hrs\",\"endRange\":\"Inf\",\"description\":\"Red Hat Enterprise Linux (Amazon VPC), m4.xlarge reserved instance applied\",\"appliesTo\":[],\"rateCode\":\"H4U3243366KVUYPJ.CUZHX8X6JH.6YS6EN2CT7\",\"beginRange\":\"0\",\"pricePerUnit\":{\"USD\":\"0.1511000000\"}},\"H4U3243366KVUYPJ.CUZHX8X6JH.2TG2D8R56U\":{\"unit\":\"Quantity\",\"description\":\"Upfront Fee\",\"appliesTo\":[],\"rateCode\":\"H4U3243366KVUYPJ.CUZHX8X6JH.2TG2D8R56U\",\"pricePerUnit\":{\"USD\":\"798\"}}},\"sku\":\"H4U3243366KVUYPJ\",\"effectiveDate\":\"2017-10-31T23:59:59Z\",\"offerTermCode\":\"CUZHX8X6JH\",\"termAttributes\":{\"LeaseContractLength\":\"1yr\",\"OfferingClass\":\"convertible\",\"PurchaseOption\":\"Partial Upfront\"}},\"H4U3243366KVUYPJ.7NE97W5U4E\":{\"priceDimensions\":{\"H4U3243366KVUYPJ.7NE97W5U4E.6YS6EN2CT7\":{\"unit\":\"Hrs\",\"endRange\":\"Inf\",\"description\":\"Red Hat Enterprise Linux (Amazon VPC), m4.xlarge reserved instance applied\",\"appliesTo\":[],\"rateCode\":\"H4U3243366KVUYPJ.7NE97W5U4E.6YS6EN2CT7\",\"beginRange\":\"0\",\"pricePerUnit\":{\"USD\":\"0.2513000000\"}}},\"sku\":\"H4U3243366KVUYPJ\",\"effectiveDate\":\"2017-10-31T23:59:59Z\",\"offerTermCode\":\"7NE97W5U4E\",\"termAttributes\":{\"LeaseContractLength\":\"1yr\",\"OfferingClass\":\"convertible\",\"PurchaseOption\":\"No Upfront\"}},\"H4U3243366KVUYPJ.HU7G6KETJZ\":{\"priceDimensions\":{\"H4U3243366KVUYPJ.HU7G6KETJZ.2TG2D8R56U\":{\"unit\":\"Quantity\",\"description\":\"Upfront Fee\",\"appliesTo\":[],\"rateCode\":\"H4U3243366KVUYPJ.HU7G6KETJZ.2TG2D8R56U\",\"pricePerUnit\":{\"USD\":\"694\"}},\"H4U3243366KVUYPJ.HU7G6KETJZ.6YS6EN2CT7\":{\"unit\":\"Hrs\",\"endRange\":\"Inf\",\"description\":\"Red Hat Enterprise Linux (Amazon VPC), m4.xlarge reserved instance applied\",\"appliesTo\":[],\"rateCode\":\"H4U3243366KVUYPJ.HU7G6KETJZ.6YS6EN2CT7\",\"beginRange\":\"0\",\"pricePerUnit\":{\"USD\":\"0.1392000000\"}}},\"sku\":\"H4U3243366KVUYPJ\",\"effectiveDate\":\"2017-04-30T23:59:59Z\",\"offerTermCode\":\"HU7G6KETJZ\",\"termAttributes\":{\"LeaseContractLength\":\"1yr\",\"OfferingClass\":\"standard\",\"PurchaseOption\":\"Partial Upfront\"}},\"H4U3243366KVUYPJ.6QCMYABX3D\":{\"priceDimensions\":{\"H4U3243366KVUYPJ.6QCMYABX3D.6YS6EN2CT7\":{\"unit\":\"Hrs\",\"endRange\":\"Inf\",\"description\":\"USD 0.0 per Red Hat Enterprise Linux (Amazon VPC), m4.xlarge reserved instance applied\",\"appliesTo\":[],\"rateCode\":\"H4U3243366KVUYPJ.6QCMYABX3D.6YS6EN2CT7\",\"beginRange\":\"0\",\"pricePerUnit\":{\"USD\":\"0.0000000000\"}},\"H4U3243366KVUYPJ.6QCMYABX3D.2TG2D8R56U\":{\"unit\":\"Quantity\",\"description\":\"Upfront Fee\",\"appliesTo\":[],\"rateCode\":\"H4U3243366KVUYPJ.6QCMYABX3D.2TG2D8R56U\",\"pricePerUnit\":{\"USD\":\"1885\"}}},\"sku\":\"H4U3243366KVUYPJ\",\"effectiveDate\":\"2017-04-30T23:59:59Z\",\"offerTermCode\":\"6QCMYABX3D\",\"termAttributes\":{\"LeaseContractLength\":\"1yr\",\"OfferingClass\":\"standard\",\"PurchaseOption\":\"All Upfront\"}},\"H4U3243366KVUYPJ.VJWZNREJX2\":{\"priceDimensions\":{\"H4U3243366KVUYPJ.VJWZNREJX2.2TG2D8R56U\":{\"unit\":\"Quantity\",\"description\":\"Upfront Fee\",\"appliesTo\":[],\"rateCode\":\"H4U3243366KVUYPJ.VJWZNREJX2.2TG2D8R56U\",\"pricePerUnit\":{\"USD\":\"2089\"}},\"H4U3243366KVUYPJ.VJWZNREJX2.6YS6EN2CT7\":{\"unit\":\"Hrs\",\"endRange\":\"Inf\",\"description\":\"Red Hat Enterprise Linux (Amazon VPC), m4.xlarge reserved instance applied\",\"appliesTo\":[],\"rateCode\":\"H4U3243366KVUYPJ.VJWZNREJX2.6YS6EN2CT7\",\"beginRange\":\"0\",\"pricePerUnit\":{\"USD\":\"0.0000000000\"}}},\"sku\":\"H4U3243366KVUYPJ\",\"effectiveDate\":\"2017-10-31T23:59:59Z\",\"offerTermCode\":\"VJWZNREJX2\",\"termAttributes\":{\"LeaseContractLength\":\"1yr\",\"OfferingClass\":\"convertible\",\"PurchaseOption\":\"All Upfront\"}},\"H4U3243366KVUYPJ.Z2E3P23VKM\":{\"priceDimensions\":{\"H4U3243366KVUYPJ.Z2E3P23VKM.6YS6EN2CT7\":{\"unit\":\"Hrs\",\"endRange\":\"Inf\",\"description\":\"Red Hat Enterprise Linux (Amazon VPC), m4.xlarge reserved instance applied\",\"appliesTo\":[],\"rateCode\":\"H4U3243366KVUYPJ.Z2E3P23VKM.6YS6EN2CT7\",\"beginRange\":\"0\",\"pricePerUnit\":{\"USD\":\"0.1966000000\"}}},\"sku\":\"H4U3243366KVUYPJ\",\"effectiveDate\":\"2017-04-30T23:59:59Z\",\"offerTermCode\":\"Z2E3P23VKM\",\"termAttributes\":{\"LeaseContractLength\":\"3yr\",\"OfferingClass\":\"convertible\",\"PurchaseOption\":\"No Upfront\"}},\"H4U3243366KVUYPJ.NQ3QZPMQV9\":{\"priceDimensions\":{\"H4U3243366KVUYPJ.NQ3QZPMQV9.2TG2D8R56U\":{\"unit\":\"Quantity\",\"description\":\"Upfront Fee\",\"appliesTo\":[],\"rateCode\":\"H4U3243366KVUYPJ.NQ3QZPMQV9.2TG2D8R56U\",\"pricePerUnit\":{\"USD\":\"4294\"}},\"H4U3243366KVUYPJ.NQ3QZPMQV9.6YS6EN2CT7\":{\"unit\":\"Hrs\",\"endRange\":\"Inf\",\"description\":\"USD 0.0 per Red Hat Enterprise Linux (Amazon VPC), m4.xlarge reserved instance applied\",\"appliesTo\":[],\"rateCode\":\"H4U3243366KVUYPJ.NQ3QZPMQV9.6YS6EN2CT7\",\"beginRange\":\"0\",\"pricePerUnit\":{\"USD\":\"0.0000000000\"}}},\"sku\":\"H4U3243366KVUYPJ\",\"effectiveDate\":\"2017-04-30T23:59:59Z\",\"offerTermCode\":\"NQ3QZPMQV9\",\"termAttributes\":{\"LeaseContractLength\":\"3yr\",\"OfferingClass\":\"standard\",\"PurchaseOption\":\"All Upfront\"}}}},\"version\":\"20190116212448\",\"publicationDate\":\"2019-01-16T21:24:48Z\"}", + "{\"product\":{\"productFamily\":\"Compute Instance\",\"attributes\":{\"enhancedNetworkingSupported\":\"Yes\",\"memory\":\"16 GiB\",\"dedicatedEbsThroughput\":\"750 Mbps\",\"vcpu\":\"4\",\"capacitystatus\":\"Used\",\"locationType\":\"AWS Region\",\"storage\":\"EBS only\",\"instanceFamily\":\"General purpose\",\"operatingSystem\":\"RHEL\",\"physicalProcessor\":\"Intel Xeon E5-2676 v3 (Haswell)\",\"clockSpeed\":\"2.4 GHz\",\"ecu\":\"13\",\"networkPerformance\":\"High\",\"servicename\":\"Amazon Elastic Compute Cloud\",\"instanceType\":\"m4.xlarge\",\"tenancy\":\"Shared\",\"usagetype\":\"EU-BoxUsage:m4.xlarge\",\"normalizationSizeFactor\":\"8\",\"processorFeatures\":\"Intel AVX; Intel AVX2; Intel Turbo\",\"servicecode\":\"AmazonEC2\",\"licenseModel\":\"No License required\",\"currentGeneration\":\"Yes\",\"preInstalledSw\":\"NA\",\"location\":\"EU (Ireland)\",\"processorArchitecture\":\"64-bit\",\"operation\":\"RunInstances:0010\"},\"sku\":\"M99NCAWRZV658GRP\"},\"serviceCode\":\"AmazonEC2\",\"terms\":{\"OnDemand\":{\"M99NCAWRZV658GRP.JRTCKXETXF\":{\"priceDimensions\":{\"M99NCAWRZV658GRP.JRTCKXETXF.6YS6EN2CT7\":{\"unit\":\"Hrs\",\"endRange\":\"Inf\",\"description\":\"$0.282 per On Demand RHEL m4.xlarge Instance Hour\",\"appliesTo\":[],\"rateCode\":\"M99NCAWRZV658GRP.JRTCKXETXF.6YS6EN2CT7\",\"beginRange\":\"0\",\"pricePerUnit\":{\"USD\":\"0.2820000000\"}}},\"sku\":\"M99NCAWRZV658GRP\",\"effectiveDate\":\"2019-01-01T00:00:00Z\",\"offerTermCode\":\"JRTCKXETXF\",\"termAttributes\":{}}},\"Reserved\":{\"M99NCAWRZV658GRP.7NE97W5U4E\":{\"priceDimensions\":{\"M99NCAWRZV658GRP.7NE97W5U4E.6YS6EN2CT7\":{\"unit\":\"Hrs\",\"endRange\":\"Inf\",\"description\":\"Red Hat Enterprise Linux (Amazon VPC), m4.xlarge reserved instance applied\",\"appliesTo\":[],\"rateCode\":\"M99NCAWRZV658GRP.7NE97W5U4E.6YS6EN2CT7\",\"beginRange\":\"0\",\"pricePerUnit\":{\"USD\":\"0.2339000000\"}}},\"sku\":\"M99NCAWRZV658GRP\",\"effectiveDate\":\"2017-10-31T23:59:59Z\",\"offerTermCode\":\"7NE97W5U4E\",\"termAttributes\":{\"LeaseContractLength\":\"1yr\",\"OfferingClass\":\"convertible\",\"PurchaseOption\":\"No Upfront\"}},\"M99NCAWRZV658GRP.CUZHX8X6JH\":{\"priceDimensions\":{\"M99NCAWRZV658GRP.CUZHX8X6JH.2TG2D8R56U\":{\"unit\":\"Quantity\",\"description\":\"Upfront Fee\",\"appliesTo\":[],\"rateCode\":\"M99NCAWRZV658GRP.CUZHX8X6JH.2TG2D8R56U\",\"pricePerUnit\":{\"USD\":\"725\"}},\"M99NCAWRZV658GRP.CUZHX8X6JH.6YS6EN2CT7\":{\"unit\":\"Hrs\",\"endRange\":\"Inf\",\"description\":\"Red Hat Enterprise Linux (Amazon VPC), m4.xlarge reserved instance applied\",\"appliesTo\":[],\"rateCode\":\"M99NCAWRZV658GRP.CUZHX8X6JH.6YS6EN2CT7\",\"beginRange\":\"0\",\"pricePerUnit\":{\"USD\":\"0.1428000000\"}}},\"sku\":\"M99NCAWRZV658GRP\",\"effectiveDate\":\"2017-10-31T23:59:59Z\",\"offerTermCode\":\"CUZHX8X6JH\",\"termAttributes\":{\"LeaseContractLength\":\"1yr\",\"OfferingClass\":\"convertible\",\"PurchaseOption\":\"Partial Upfront\"}},\"M99NCAWRZV658GRP.4NA7Y494T4\":{\"priceDimensions\":{\"M99NCAWRZV658GRP.4NA7Y494T4.6YS6EN2CT7\":{\"unit\":\"Hrs\",\"endRange\":\"Inf\",\"description\":\"Red Hat Enterprise Linux (Amazon VPC), m4.xlarge reserved instance applied\",\"appliesTo\":[],\"rateCode\":\"M99NCAWRZV658GRP.4NA7Y494T4.6YS6EN2CT7\",\"beginRange\":\"0\",\"pricePerUnit\":{\"USD\":\"0.2112000000\"}}},\"sku\":\"M99NCAWRZV658GRP\",\"effectiveDate\":\"2017-04-30T23:59:59Z\",\"offerTermCode\":\"4NA7Y494T4\",\"termAttributes\":{\"LeaseContractLength\":\"1yr\",\"OfferingClass\":\"standard\",\"PurchaseOption\":\"No Upfront\"}},\"M99NCAWRZV658GRP.VJWZNREJX2\":{\"priceDimensions\":{\"M99NCAWRZV658GRP.VJWZNREJX2.2TG2D8R56U\":{\"unit\":\"Quantity\",\"description\":\"Upfront Fee\",\"appliesTo\":[],\"rateCode\":\"M99NCAWRZV658GRP.VJWZNREJX2.2TG2D8R56U\",\"pricePerUnit\":{\"USD\":\"1947\"}},\"M99NCAWRZV658GRP.VJWZNREJX2.6YS6EN2CT7\":{\"unit\":\"Hrs\",\"endRange\":\"Inf\",\"description\":\"Red Hat Enterprise Linux (Amazon VPC), m4.xlarge reserved instance applied\",\"appliesTo\":[],\"rateCode\":\"M99NCAWRZV658GRP.VJWZNREJX2.6YS6EN2CT7\",\"beginRange\":\"0\",\"pricePerUnit\":{\"USD\":\"0.0000000000\"}}},\"sku\":\"M99NCAWRZV658GRP\",\"effectiveDate\":\"2017-10-31T23:59:59Z\",\"offerTermCode\":\"VJWZNREJX2\",\"termAttributes\":{\"LeaseContractLength\":\"1yr\",\"OfferingClass\":\"convertible\",\"PurchaseOption\":\"All Upfront\"}},\"M99NCAWRZV658GRP.HU7G6KETJZ\":{\"priceDimensions\":{\"M99NCAWRZV658GRP.HU7G6KETJZ.2TG2D8R56U\":{\"unit\":\"Quantity\",\"description\":\"Upfront Fee\",\"appliesTo\":[],\"rateCode\":\"M99NCAWRZV658GRP.HU7G6KETJZ.2TG2D8R56U\",\"pricePerUnit\":{\"USD\":\"631\"}},\"M99NCAWRZV658GRP.HU7G6KETJZ.6YS6EN2CT7\":{\"unit\":\"Hrs\",\"endRange\":\"Inf\",\"description\":\"Red Hat Enterprise Linux (Amazon VPC), m4.xlarge reserved instance applied\",\"appliesTo\":[],\"rateCode\":\"M99NCAWRZV658GRP.HU7G6KETJZ.6YS6EN2CT7\",\"beginRange\":\"0\",\"pricePerUnit\":{\"USD\":\"0.1320000000\"}}},\"sku\":\"M99NCAWRZV658GRP\",\"effectiveDate\":\"2017-04-30T23:59:59Z\",\"offerTermCode\":\"HU7G6KETJZ\",\"termAttributes\":{\"LeaseContractLength\":\"1yr\",\"OfferingClass\":\"standard\",\"PurchaseOption\":\"Partial Upfront\"}},\"M99NCAWRZV658GRP.MZU6U2429S\":{\"priceDimensions\":{\"M99NCAWRZV658GRP.MZU6U2429S.2TG2D8R56U\":{\"unit\":\"Quantity\",\"description\":\"Upfront Fee\",\"appliesTo\":[],\"rateCode\":\"M99NCAWRZV658GRP.MZU6U2429S.2TG2D8R56U\",\"pricePerUnit\":{\"USD\":\"4539\"}},\"M99NCAWRZV658GRP.MZU6U2429S.6YS6EN2CT7\":{\"unit\":\"Hrs\",\"endRange\":\"Inf\",\"description\":\"USD 0.0 per Red Hat Enterprise Linux (Amazon VPC), m4.xlarge reserved instance applied\",\"appliesTo\":[],\"rateCode\":\"M99NCAWRZV658GRP.MZU6U2429S.6YS6EN2CT7\",\"beginRange\":\"0\",\"pricePerUnit\":{\"USD\":\"0.0000000000\"}}},\"sku\":\"M99NCAWRZV658GRP\",\"effectiveDate\":\"2017-04-30T23:59:59Z\",\"offerTermCode\":\"MZU6U2429S\",\"termAttributes\":{\"LeaseContractLength\":\"3yr\",\"OfferingClass\":\"convertible\",\"PurchaseOption\":\"All Upfront\"}},\"M99NCAWRZV658GRP.NQ3QZPMQV9\":{\"priceDimensions\":{\"M99NCAWRZV658GRP.NQ3QZPMQV9.2TG2D8R56U\":{\"unit\":\"Quantity\",\"description\":\"Upfront Fee\",\"appliesTo\":[],\"rateCode\":\"M99NCAWRZV658GRP.NQ3QZPMQV9.2TG2D8R56U\",\"pricePerUnit\":{\"USD\":\"4047\"}},\"M99NCAWRZV658GRP.NQ3QZPMQV9.6YS6EN2CT7\":{\"unit\":\"Hrs\",\"endRange\":\"Inf\",\"description\":\"USD 0.0 per Red Hat Enterprise Linux (Amazon VPC), m4.xlarge reserved instance applied\",\"appliesTo\":[],\"rateCode\":\"M99NCAWRZV658GRP.NQ3QZPMQV9.6YS6EN2CT7\",\"beginRange\":\"0\",\"pricePerUnit\":{\"USD\":\"0.0000000000\"}}},\"sku\":\"M99NCAWRZV658GRP\",\"effectiveDate\":\"2017-04-30T23:59:59Z\",\"offerTermCode\":\"NQ3QZPMQV9\",\"termAttributes\":{\"LeaseContractLength\":\"3yr\",\"OfferingClass\":\"standard\",\"PurchaseOption\":\"All Upfront\"}},\"M99NCAWRZV658GRP.BPH4J8HBKS\":{\"priceDimensions\":{\"M99NCAWRZV658GRP.BPH4J8HBKS.6YS6EN2CT7\":{\"unit\":\"Hrs\",\"endRange\":\"Inf\",\"description\":\"Red Hat Enterprise Linux (Amazon VPC), m4.xlarge reserved instance applied\",\"appliesTo\":[],\"rateCode\":\"M99NCAWRZV658GRP.BPH4J8HBKS.6YS6EN2CT7\",\"beginRange\":\"0\",\"pricePerUnit\":{\"USD\":\"0.1680000000\"}}},\"sku\":\"M99NCAWRZV658GRP\",\"effectiveDate\":\"2017-04-30T23:59:59Z\",\"offerTermCode\":\"BPH4J8HBKS\",\"termAttributes\":{\"LeaseContractLength\":\"3yr\",\"OfferingClass\":\"standard\",\"PurchaseOption\":\"No Upfront\"}},\"M99NCAWRZV658GRP.Z2E3P23VKM\":{\"priceDimensions\":{\"M99NCAWRZV658GRP.Z2E3P23VKM.6YS6EN2CT7\":{\"unit\":\"Hrs\",\"endRange\":\"Inf\",\"description\":\"Red Hat Enterprise Linux (Amazon VPC), m4.xlarge reserved instance applied\",\"appliesTo\":[],\"rateCode\":\"M99NCAWRZV658GRP.Z2E3P23VKM.6YS6EN2CT7\",\"beginRange\":\"0\",\"pricePerUnit\":{\"USD\":\"0.1842000000\"}}},\"sku\":\"M99NCAWRZV658GRP\",\"effectiveDate\":\"2017-04-30T23:59:59Z\",\"offerTermCode\":\"Z2E3P23VKM\",\"termAttributes\":{\"LeaseContractLength\":\"3yr\",\"OfferingClass\":\"convertible\",\"PurchaseOption\":\"No Upfront\"}},\"M99NCAWRZV658GRP.6QCMYABX3D\":{\"priceDimensions\":{\"M99NCAWRZV658GRP.6QCMYABX3D.6YS6EN2CT7\":{\"unit\":\"Hrs\",\"endRange\":\"Inf\",\"description\":\"USD 0.0 per Red Hat Enterprise Linux (Amazon VPC), m4.xlarge reserved instance applied\",\"appliesTo\":[],\"rateCode\":\"M99NCAWRZV658GRP.6QCMYABX3D.6YS6EN2CT7\",\"beginRange\":\"0\",\"pricePerUnit\":{\"USD\":\"0.0000000000\"}},\"M99NCAWRZV658GRP.6QCMYABX3D.2TG2D8R56U\":{\"unit\":\"Quantity\",\"description\":\"Upfront Fee\",\"appliesTo\":[],\"rateCode\":\"M99NCAWRZV658GRP.6QCMYABX3D.2TG2D8R56U\",\"pricePerUnit\":{\"USD\":\"1762\"}}},\"sku\":\"M99NCAWRZV658GRP\",\"effectiveDate\":\"2017-04-30T23:59:59Z\",\"offerTermCode\":\"6QCMYABX3D\",\"termAttributes\":{\"LeaseContractLength\":\"1yr\",\"OfferingClass\":\"standard\",\"PurchaseOption\":\"All Upfront\"}},\"M99NCAWRZV658GRP.38NPMPTW36\":{\"priceDimensions\":{\"M99NCAWRZV658GRP.38NPMPTW36.2TG2D8R56U\":{\"unit\":\"Quantity\",\"description\":\"Upfront Fee\",\"appliesTo\":[],\"rateCode\":\"M99NCAWRZV658GRP.38NPMPTW36.2TG2D8R56U\",\"pricePerUnit\":{\"USD\":\"1314\"}},\"M99NCAWRZV658GRP.38NPMPTW36.6YS6EN2CT7\":{\"unit\":\"Hrs\",\"endRange\":\"Inf\",\"description\":\"Red Hat Enterprise Linux (Amazon VPC), m4.xlarge reserved instance applied\",\"appliesTo\":[],\"rateCode\":\"M99NCAWRZV658GRP.38NPMPTW36.6YS6EN2CT7\",\"beginRange\":\"0\",\"pricePerUnit\":{\"USD\":\"0.1100000000\"}}},\"sku\":\"M99NCAWRZV658GRP\",\"effectiveDate\":\"2017-04-30T23:59:59Z\",\"offerTermCode\":\"38NPMPTW36\",\"termAttributes\":{\"LeaseContractLength\":\"3yr\",\"OfferingClass\":\"standard\",\"PurchaseOption\":\"Partial Upfront\"}},\"M99NCAWRZV658GRP.R5XV2EPZQZ\":{\"priceDimensions\":{\"M99NCAWRZV658GRP.R5XV2EPZQZ.6YS6EN2CT7\":{\"unit\":\"Hrs\",\"endRange\":\"Inf\",\"description\":\"Red Hat Enterprise Linux (Amazon VPC), m4.xlarge reserved instance applied\",\"appliesTo\":[],\"rateCode\":\"M99NCAWRZV658GRP.R5XV2EPZQZ.6YS6EN2CT7\",\"beginRange\":\"0\",\"pricePerUnit\":{\"USD\":\"0.1175000000\"}},\"M99NCAWRZV658GRP.R5XV2EPZQZ.2TG2D8R56U\":{\"unit\":\"Quantity\",\"description\":\"Upfront Fee\",\"appliesTo\":[],\"rateCode\":\"M99NCAWRZV658GRP.R5XV2EPZQZ.2TG2D8R56U\",\"pricePerUnit\":{\"USD\":\"1511\"}}},\"sku\":\"M99NCAWRZV658GRP\",\"effectiveDate\":\"2017-04-30T23:59:59Z\",\"offerTermCode\":\"R5XV2EPZQZ\",\"termAttributes\":{\"LeaseContractLength\":\"3yr\",\"OfferingClass\":\"convertible\",\"PurchaseOption\":\"Partial Upfront\"}}}},\"version\":\"20190116212448\",\"publicationDate\":\"2019-01-16T21:24:48Z\"}", + "{\"product\":{\"productFamily\":\"Compute Instance\",\"attributes\":{\"enhancedNetworkingSupported\":\"Yes\",\"memory\":\"16 GiB\",\"dedicatedEbsThroughput\":\"750 Mbps\",\"vcpu\":\"4\",\"capacitystatus\":\"Used\",\"locationType\":\"AWS Region\",\"storage\":\"EBS only\",\"instanceFamily\":\"General purpose\",\"operatingSystem\":\"Linux\",\"physicalProcessor\":\"Intel Xeon E5-2676 v3 (Haswell)\",\"clockSpeed\":\"2.4 GHz\",\"ecu\":\"13\",\"networkPerformance\":\"High\",\"servicename\":\"Amazon Elastic Compute Cloud\",\"instanceType\":\"m4.xlarge\",\"tenancy\":\"Dedicated\",\"usagetype\":\"EU-DedicatedUsage:m4.xlarge\",\"normalizationSizeFactor\":\"8\",\"processorFeatures\":\"Intel AVX; Intel AVX2; Intel Turbo\",\"servicecode\":\"AmazonEC2\",\"licenseModel\":\"No License required\",\"currentGeneration\":\"Yes\",\"preInstalledSw\":\"NA\",\"location\":\"EU (Ireland)\",\"processorArchitecture\":\"64-bit\",\"operation\":\"RunInstances\"},\"sku\":\"QN8P2TBTGRWK6CRK\"},\"serviceCode\":\"AmazonEC2\",\"terms\":{\"OnDemand\":{\"QN8P2TBTGRWK6CRK.JRTCKXETXF\":{\"priceDimensions\":{\"QN8P2TBTGRWK6CRK.JRTCKXETXF.6YS6EN2CT7\":{\"unit\":\"Hrs\",\"endRange\":\"Inf\",\"description\":\"$0.2442 per Dedicated Linux m4.xlarge Instance Hour\",\"appliesTo\":[],\"rateCode\":\"QN8P2TBTGRWK6CRK.JRTCKXETXF.6YS6EN2CT7\",\"beginRange\":\"0\",\"pricePerUnit\":{\"USD\":\"0.2442000000\"}}},\"sku\":\"QN8P2TBTGRWK6CRK\",\"effectiveDate\":\"2019-01-01T00:00:00Z\",\"offerTermCode\":\"JRTCKXETXF\",\"termAttributes\":{}}},\"Reserved\":{\"QN8P2TBTGRWK6CRK.CUZHX8X6JH\":{\"priceDimensions\":{\"QN8P2TBTGRWK6CRK.CUZHX8X6JH.2TG2D8R56U\":{\"unit\":\"Quantity\",\"description\":\"Upfront Fee\",\"appliesTo\":[],\"rateCode\":\"QN8P2TBTGRWK6CRK.CUZHX8X6JH.2TG2D8R56U\",\"pricePerUnit\":{\"USD\":\"798\"}},\"QN8P2TBTGRWK6CRK.CUZHX8X6JH.6YS6EN2CT7\":{\"unit\":\"Hrs\",\"endRange\":\"Inf\",\"description\":\"Linux/UNIX (Amazon VPC), m4.xlarge reserved instance applied\",\"appliesTo\":[],\"rateCode\":\"QN8P2TBTGRWK6CRK.CUZHX8X6JH.6YS6EN2CT7\",\"beginRange\":\"0\",\"pricePerUnit\":{\"USD\":\"0.0911000000\"}}},\"sku\":\"QN8P2TBTGRWK6CRK\",\"effectiveDate\":\"2017-10-31T23:59:59Z\",\"offerTermCode\":\"CUZHX8X6JH\",\"termAttributes\":{\"LeaseContractLength\":\"1yr\",\"OfferingClass\":\"convertible\",\"PurchaseOption\":\"Partial Upfront\"}},\"QN8P2TBTGRWK6CRK.4NA7Y494T4\":{\"priceDimensions\":{\"QN8P2TBTGRWK6CRK.4NA7Y494T4.6YS6EN2CT7\":{\"unit\":\"Hrs\",\"endRange\":\"Inf\",\"description\":\"Linux/UNIX (Amazon VPC), m4.xlarge reserved instance applied\",\"appliesTo\":[],\"rateCode\":\"QN8P2TBTGRWK6CRK.4NA7Y494T4.6YS6EN2CT7\",\"beginRange\":\"0\",\"pricePerUnit\":{\"USD\":\"0.1663000000\"}}},\"sku\":\"QN8P2TBTGRWK6CRK\",\"effectiveDate\":\"2017-04-30T23:59:59Z\",\"offerTermCode\":\"4NA7Y494T4\",\"termAttributes\":{\"LeaseContractLength\":\"1yr\",\"OfferingClass\":\"standard\",\"PurchaseOption\":\"No Upfront\"}},\"QN8P2TBTGRWK6CRK.38NPMPTW36\":{\"priceDimensions\":{\"QN8P2TBTGRWK6CRK.38NPMPTW36.2TG2D8R56U\":{\"unit\":\"Quantity\",\"description\":\"Upfront Fee\",\"appliesTo\":[],\"rateCode\":\"QN8P2TBTGRWK6CRK.38NPMPTW36.2TG2D8R56U\",\"pricePerUnit\":{\"USD\":\"1445\"}},\"QN8P2TBTGRWK6CRK.38NPMPTW36.6YS6EN2CT7\":{\"unit\":\"Hrs\",\"endRange\":\"Inf\",\"description\":\"Linux/UNIX (Amazon VPC), m4.xlarge reserved instance applied\",\"appliesTo\":[],\"rateCode\":\"QN8P2TBTGRWK6CRK.38NPMPTW36.6YS6EN2CT7\",\"beginRange\":\"0\",\"pricePerUnit\":{\"USD\":\"0.0550000000\"}}},\"sku\":\"QN8P2TBTGRWK6CRK\",\"effectiveDate\":\"2017-04-30T23:59:59Z\",\"offerTermCode\":\"38NPMPTW36\",\"termAttributes\":{\"LeaseContractLength\":\"3yr\",\"OfferingClass\":\"standard\",\"PurchaseOption\":\"Partial Upfront\"}},\"QN8P2TBTGRWK6CRK.MZU6U2429S\":{\"priceDimensions\":{\"QN8P2TBTGRWK6CRK.MZU6U2429S.6YS6EN2CT7\":{\"unit\":\"Hrs\",\"endRange\":\"Inf\",\"description\":\"USD 0.0 per Linux/UNIX (Amazon VPC), m4.xlarge reserved instance applied\",\"appliesTo\":[],\"rateCode\":\"QN8P2TBTGRWK6CRK.MZU6U2429S.6YS6EN2CT7\",\"beginRange\":\"0\",\"pricePerUnit\":{\"USD\":\"0.0000000000\"}},\"QN8P2TBTGRWK6CRK.MZU6U2429S.2TG2D8R56U\":{\"unit\":\"Quantity\",\"description\":\"Upfront Fee\",\"appliesTo\":[],\"rateCode\":\"QN8P2TBTGRWK6CRK.MZU6U2429S.2TG2D8R56U\",\"pricePerUnit\":{\"USD\":\"3258\"}}},\"sku\":\"QN8P2TBTGRWK6CRK\",\"effectiveDate\":\"2017-04-30T23:59:59Z\",\"offerTermCode\":\"MZU6U2429S\",\"termAttributes\":{\"LeaseContractLength\":\"3yr\",\"OfferingClass\":\"convertible\",\"PurchaseOption\":\"All Upfront\"}},\"QN8P2TBTGRWK6CRK.BPH4J8HBKS\":{\"priceDimensions\":{\"QN8P2TBTGRWK6CRK.BPH4J8HBKS.6YS6EN2CT7\":{\"unit\":\"Hrs\",\"endRange\":\"Inf\",\"description\":\"Linux/UNIX (Amazon VPC), m4.xlarge reserved instance applied\",\"appliesTo\":[],\"rateCode\":\"QN8P2TBTGRWK6CRK.BPH4J8HBKS.6YS6EN2CT7\",\"beginRange\":\"0\",\"pricePerUnit\":{\"USD\":\"0.1188000000\"}}},\"sku\":\"QN8P2TBTGRWK6CRK\",\"effectiveDate\":\"2017-04-30T23:59:59Z\",\"offerTermCode\":\"BPH4J8HBKS\",\"termAttributes\":{\"LeaseContractLength\":\"3yr\",\"OfferingClass\":\"standard\",\"PurchaseOption\":\"No Upfront\"}},\"QN8P2TBTGRWK6CRK.7NE97W5U4E\":{\"priceDimensions\":{\"QN8P2TBTGRWK6CRK.7NE97W5U4E.6YS6EN2CT7\":{\"unit\":\"Hrs\",\"endRange\":\"Inf\",\"description\":\"Linux/UNIX (Amazon VPC), m4.xlarge reserved instance applied\",\"appliesTo\":[],\"rateCode\":\"QN8P2TBTGRWK6CRK.7NE97W5U4E.6YS6EN2CT7\",\"beginRange\":\"0\",\"pricePerUnit\":{\"USD\":\"0.1913000000\"}}},\"sku\":\"QN8P2TBTGRWK6CRK\",\"effectiveDate\":\"2017-10-31T23:59:59Z\",\"offerTermCode\":\"7NE97W5U4E\",\"termAttributes\":{\"LeaseContractLength\":\"1yr\",\"OfferingClass\":\"convertible\",\"PurchaseOption\":\"No Upfront\"}},\"QN8P2TBTGRWK6CRK.6QCMYABX3D\":{\"priceDimensions\":{\"QN8P2TBTGRWK6CRK.6QCMYABX3D.2TG2D8R56U\":{\"unit\":\"Quantity\",\"description\":\"Upfront Fee\",\"appliesTo\":[],\"rateCode\":\"QN8P2TBTGRWK6CRK.6QCMYABX3D.2TG2D8R56U\",\"pricePerUnit\":{\"USD\":\"1360\"}},\"QN8P2TBTGRWK6CRK.6QCMYABX3D.6YS6EN2CT7\":{\"unit\":\"Hrs\",\"endRange\":\"Inf\",\"description\":\"USD 0.0 per Linux/UNIX (Amazon VPC), m4.xlarge reserved instance applied\",\"appliesTo\":[],\"rateCode\":\"QN8P2TBTGRWK6CRK.6QCMYABX3D.6YS6EN2CT7\",\"beginRange\":\"0\",\"pricePerUnit\":{\"USD\":\"0.0000000000\"}}},\"sku\":\"QN8P2TBTGRWK6CRK\",\"effectiveDate\":\"2017-04-30T23:59:59Z\",\"offerTermCode\":\"6QCMYABX3D\",\"termAttributes\":{\"LeaseContractLength\":\"1yr\",\"OfferingClass\":\"standard\",\"PurchaseOption\":\"All Upfront\"}},\"QN8P2TBTGRWK6CRK.VJWZNREJX2\":{\"priceDimensions\":{\"QN8P2TBTGRWK6CRK.VJWZNREJX2.2TG2D8R56U\":{\"unit\":\"Quantity\",\"description\":\"Upfront Fee\",\"appliesTo\":[],\"rateCode\":\"QN8P2TBTGRWK6CRK.VJWZNREJX2.2TG2D8R56U\",\"pricePerUnit\":{\"USD\":\"1564\"}},\"QN8P2TBTGRWK6CRK.VJWZNREJX2.6YS6EN2CT7\":{\"unit\":\"Hrs\",\"endRange\":\"Inf\",\"description\":\"Linux/UNIX (Amazon VPC), m4.xlarge reserved instance applied\",\"appliesTo\":[],\"rateCode\":\"QN8P2TBTGRWK6CRK.VJWZNREJX2.6YS6EN2CT7\",\"beginRange\":\"0\",\"pricePerUnit\":{\"USD\":\"0.0000000000\"}}},\"sku\":\"QN8P2TBTGRWK6CRK\",\"effectiveDate\":\"2017-10-31T23:59:59Z\",\"offerTermCode\":\"VJWZNREJX2\",\"termAttributes\":{\"LeaseContractLength\":\"1yr\",\"OfferingClass\":\"convertible\",\"PurchaseOption\":\"All Upfront\"}},\"QN8P2TBTGRWK6CRK.R5XV2EPZQZ\":{\"priceDimensions\":{\"QN8P2TBTGRWK6CRK.R5XV2EPZQZ.2TG2D8R56U\":{\"unit\":\"Quantity\",\"description\":\"Upfront Fee\",\"appliesTo\":[],\"rateCode\":\"QN8P2TBTGRWK6CRK.R5XV2EPZQZ.2TG2D8R56U\",\"pricePerUnit\":{\"USD\":\"1662\"}},\"QN8P2TBTGRWK6CRK.R5XV2EPZQZ.6YS6EN2CT7\":{\"unit\":\"Hrs\",\"endRange\":\"Inf\",\"description\":\"Linux/UNIX (Amazon VPC), m4.xlarge reserved instance applied\",\"appliesTo\":[],\"rateCode\":\"QN8P2TBTGRWK6CRK.R5XV2EPZQZ.6YS6EN2CT7\",\"beginRange\":\"0\",\"pricePerUnit\":{\"USD\":\"0.0633000000\"}}},\"sku\":\"QN8P2TBTGRWK6CRK\",\"effectiveDate\":\"2017-04-30T23:59:59Z\",\"offerTermCode\":\"R5XV2EPZQZ\",\"termAttributes\":{\"LeaseContractLength\":\"3yr\",\"OfferingClass\":\"convertible\",\"PurchaseOption\":\"Partial Upfront\"}},\"QN8P2TBTGRWK6CRK.HU7G6KETJZ\":{\"priceDimensions\":{\"QN8P2TBTGRWK6CRK.HU7G6KETJZ.2TG2D8R56U\":{\"unit\":\"Quantity\",\"description\":\"Upfront Fee\",\"appliesTo\":[],\"rateCode\":\"QN8P2TBTGRWK6CRK.HU7G6KETJZ.2TG2D8R56U\",\"pricePerUnit\":{\"USD\":\"694\"}},\"QN8P2TBTGRWK6CRK.HU7G6KETJZ.6YS6EN2CT7\":{\"unit\":\"Hrs\",\"endRange\":\"Inf\",\"description\":\"Linux/UNIX (Amazon VPC), m4.xlarge reserved instance applied\",\"appliesTo\":[],\"rateCode\":\"QN8P2TBTGRWK6CRK.HU7G6KETJZ.6YS6EN2CT7\",\"beginRange\":\"0\",\"pricePerUnit\":{\"USD\":\"0.0792000000\"}}},\"sku\":\"QN8P2TBTGRWK6CRK\",\"effectiveDate\":\"2017-04-30T23:59:59Z\",\"offerTermCode\":\"HU7G6KETJZ\",\"termAttributes\":{\"LeaseContractLength\":\"1yr\",\"OfferingClass\":\"standard\",\"PurchaseOption\":\"Partial Upfront\"}},\"QN8P2TBTGRWK6CRK.NQ3QZPMQV9\":{\"priceDimensions\":{\"QN8P2TBTGRWK6CRK.NQ3QZPMQV9.2TG2D8R56U\":{\"unit\":\"Quantity\",\"description\":\"Upfront Fee\",\"appliesTo\":[],\"rateCode\":\"QN8P2TBTGRWK6CRK.NQ3QZPMQV9.2TG2D8R56U\",\"pricePerUnit\":{\"USD\":\"2717\"}},\"QN8P2TBTGRWK6CRK.NQ3QZPMQV9.6YS6EN2CT7\":{\"unit\":\"Hrs\",\"endRange\":\"Inf\",\"description\":\"USD 0.0 per Linux/UNIX (Amazon VPC), m4.xlarge reserved instance applied\",\"appliesTo\":[],\"rateCode\":\"QN8P2TBTGRWK6CRK.NQ3QZPMQV9.6YS6EN2CT7\",\"beginRange\":\"0\",\"pricePerUnit\":{\"USD\":\"0.0000000000\"}}},\"sku\":\"QN8P2TBTGRWK6CRK\",\"effectiveDate\":\"2017-04-30T23:59:59Z\",\"offerTermCode\":\"NQ3QZPMQV9\",\"termAttributes\":{\"LeaseContractLength\":\"3yr\",\"OfferingClass\":\"standard\",\"PurchaseOption\":\"All Upfront\"}},\"QN8P2TBTGRWK6CRK.Z2E3P23VKM\":{\"priceDimensions\":{\"QN8P2TBTGRWK6CRK.Z2E3P23VKM.6YS6EN2CT7\":{\"unit\":\"Hrs\",\"endRange\":\"Inf\",\"description\":\"Linux/UNIX (Amazon VPC), m4.xlarge reserved instance applied\",\"appliesTo\":[],\"rateCode\":\"QN8P2TBTGRWK6CRK.Z2E3P23VKM.6YS6EN2CT7\",\"beginRange\":\"0\",\"pricePerUnit\":{\"USD\":\"0.1366000000\"}}},\"sku\":\"QN8P2TBTGRWK6CRK\",\"effectiveDate\":\"2017-04-30T23:59:59Z\",\"offerTermCode\":\"Z2E3P23VKM\",\"termAttributes\":{\"LeaseContractLength\":\"3yr\",\"OfferingClass\":\"convertible\",\"PurchaseOption\":\"No Upfront\"}}}},\"version\":\"20190116212448\",\"publicationDate\":\"2019-01-16T21:24:48Z\"}", + "{\"product\":{\"productFamily\":\"Compute Instance\",\"attributes\":{\"enhancedNetworkingSupported\":\"Yes\",\"memory\":\"16 GiB\",\"dedicatedEbsThroughput\":\"750 Mbps\",\"vcpu\":\"4\",\"capacitystatus\":\"Used\",\"locationType\":\"AWS Region\",\"storage\":\"EBS only\",\"instanceFamily\":\"General purpose\",\"operatingSystem\":\"Windows\",\"physicalProcessor\":\"Intel Xeon E5-2676 v3 (Haswell)\",\"clockSpeed\":\"2.4 GHz\",\"ecu\":\"13\",\"networkPerformance\":\"High\",\"servicename\":\"Amazon Elastic Compute Cloud\",\"instanceType\":\"m4.xlarge\",\"tenancy\":\"Shared\",\"usagetype\":\"EU-BoxUsage:m4.xlarge\",\"normalizationSizeFactor\":\"8\",\"processorFeatures\":\"Intel AVX; Intel AVX2; Intel Turbo\",\"servicecode\":\"AmazonEC2\",\"licenseModel\":\"No License required\",\"currentGeneration\":\"Yes\",\"preInstalledSw\":\"NA\",\"location\":\"EU (Ireland)\",\"processorArchitecture\":\"64-bit\",\"operation\":\"RunInstances:0002\"},\"sku\":\"SB23J89QM4VUQ5AT\"},\"serviceCode\":\"AmazonEC2\",\"terms\":{\"OnDemand\":{\"SB23J89QM4VUQ5AT.JRTCKXETXF\":{\"priceDimensions\":{\"SB23J89QM4VUQ5AT.JRTCKXETXF.6YS6EN2CT7\":{\"unit\":\"Hrs\",\"endRange\":\"Inf\",\"description\":\"$0.406 per On Demand Windows m4.xlarge Instance Hour\",\"appliesTo\":[],\"rateCode\":\"SB23J89QM4VUQ5AT.JRTCKXETXF.6YS6EN2CT7\",\"beginRange\":\"0\",\"pricePerUnit\":{\"USD\":\"0.4060000000\"}}},\"sku\":\"SB23J89QM4VUQ5AT\",\"effectiveDate\":\"2019-01-01T00:00:00Z\",\"offerTermCode\":\"JRTCKXETXF\",\"termAttributes\":{}}},\"Reserved\":{\"SB23J89QM4VUQ5AT.6QCMYABX3D\":{\"priceDimensions\":{\"SB23J89QM4VUQ5AT.6QCMYABX3D.6YS6EN2CT7\":{\"unit\":\"Hrs\",\"endRange\":\"Inf\",\"description\":\"USD 0.0 per Windows (Amazon VPC), m4.xlarge reserved instance applied\",\"appliesTo\":[],\"rateCode\":\"SB23J89QM4VUQ5AT.6QCMYABX3D.6YS6EN2CT7\",\"beginRange\":\"0\",\"pricePerUnit\":{\"USD\":\"0.0000000000\"}},\"SB23J89QM4VUQ5AT.6QCMYABX3D.2TG2D8R56U\":{\"unit\":\"Quantity\",\"description\":\"Upfront Fee\",\"appliesTo\":[],\"rateCode\":\"SB23J89QM4VUQ5AT.6QCMYABX3D.2TG2D8R56U\",\"pricePerUnit\":{\"USD\":\"2848\"}}},\"sku\":\"SB23J89QM4VUQ5AT\",\"effectiveDate\":\"2017-04-30T23:59:59Z\",\"offerTermCode\":\"6QCMYABX3D\",\"termAttributes\":{\"LeaseContractLength\":\"1yr\",\"OfferingClass\":\"standard\",\"PurchaseOption\":\"All Upfront\"}},\"SB23J89QM4VUQ5AT.VJWZNREJX2\":{\"priceDimensions\":{\"SB23J89QM4VUQ5AT.VJWZNREJX2.2TG2D8R56U\":{\"unit\":\"Quantity\",\"description\":\"Upfront Fee\",\"appliesTo\":[],\"rateCode\":\"SB23J89QM4VUQ5AT.VJWZNREJX2.2TG2D8R56U\",\"pricePerUnit\":{\"USD\":\"3033\"}},\"SB23J89QM4VUQ5AT.VJWZNREJX2.6YS6EN2CT7\":{\"unit\":\"Hrs\",\"endRange\":\"Inf\",\"description\":\"Windows (Amazon VPC), m4.xlarge reserved instance applied\",\"appliesTo\":[],\"rateCode\":\"SB23J89QM4VUQ5AT.VJWZNREJX2.6YS6EN2CT7\",\"beginRange\":\"0\",\"pricePerUnit\":{\"USD\":\"0.0000000000\"}}},\"sku\":\"SB23J89QM4VUQ5AT\",\"effectiveDate\":\"2017-10-31T23:59:59Z\",\"offerTermCode\":\"VJWZNREJX2\",\"termAttributes\":{\"LeaseContractLength\":\"1yr\",\"OfferingClass\":\"convertible\",\"PurchaseOption\":\"All Upfront\"}},\"SB23J89QM4VUQ5AT.HU7G6KETJZ\":{\"priceDimensions\":{\"SB23J89QM4VUQ5AT.HU7G6KETJZ.6YS6EN2CT7\":{\"unit\":\"Hrs\",\"endRange\":\"Inf\",\"description\":\"Windows (Amazon VPC), m4.xlarge reserved instance applied\",\"appliesTo\":[],\"rateCode\":\"SB23J89QM4VUQ5AT.HU7G6KETJZ.6YS6EN2CT7\",\"beginRange\":\"0\",\"pricePerUnit\":{\"USD\":\"0.1640000000\"}},\"SB23J89QM4VUQ5AT.HU7G6KETJZ.2TG2D8R56U\":{\"unit\":\"Quantity\",\"description\":\"Upfront Fee\",\"appliesTo\":[],\"rateCode\":\"SB23J89QM4VUQ5AT.HU7G6KETJZ.2TG2D8R56U\",\"pricePerUnit\":{\"USD\":\"1437\"}}},\"sku\":\"SB23J89QM4VUQ5AT\",\"effectiveDate\":\"2017-04-30T23:59:59Z\",\"offerTermCode\":\"HU7G6KETJZ\",\"termAttributes\":{\"LeaseContractLength\":\"1yr\",\"OfferingClass\":\"standard\",\"PurchaseOption\":\"Partial Upfront\"}},\"SB23J89QM4VUQ5AT.4NA7Y494T4\":{\"priceDimensions\":{\"SB23J89QM4VUQ5AT.4NA7Y494T4.6YS6EN2CT7\":{\"unit\":\"Hrs\",\"endRange\":\"Inf\",\"description\":\"Windows (Amazon VPC), m4.xlarge reserved instance applied\",\"appliesTo\":[],\"rateCode\":\"SB23J89QM4VUQ5AT.4NA7Y494T4.6YS6EN2CT7\",\"beginRange\":\"0\",\"pricePerUnit\":{\"USD\":\"0.3352000000\"}}},\"sku\":\"SB23J89QM4VUQ5AT\",\"effectiveDate\":\"2017-04-30T23:59:59Z\",\"offerTermCode\":\"4NA7Y494T4\",\"termAttributes\":{\"LeaseContractLength\":\"1yr\",\"OfferingClass\":\"standard\",\"PurchaseOption\":\"No Upfront\"}},\"SB23J89QM4VUQ5AT.38NPMPTW36\":{\"priceDimensions\":{\"SB23J89QM4VUQ5AT.38NPMPTW36.2TG2D8R56U\":{\"unit\":\"Quantity\",\"description\":\"Upfront Fee\",\"appliesTo\":[],\"rateCode\":\"SB23J89QM4VUQ5AT.38NPMPTW36.2TG2D8R56U\",\"pricePerUnit\":{\"USD\":\"3732\"}},\"SB23J89QM4VUQ5AT.38NPMPTW36.6YS6EN2CT7\":{\"unit\":\"Hrs\",\"endRange\":\"Inf\",\"description\":\"Windows (Amazon VPC), m4.xlarge reserved instance applied\",\"appliesTo\":[],\"rateCode\":\"SB23J89QM4VUQ5AT.38NPMPTW36.6YS6EN2CT7\",\"beginRange\":\"0\",\"pricePerUnit\":{\"USD\":\"0.1420000000\"}}},\"sku\":\"SB23J89QM4VUQ5AT\",\"effectiveDate\":\"2017-04-30T23:59:59Z\",\"offerTermCode\":\"38NPMPTW36\",\"termAttributes\":{\"LeaseContractLength\":\"3yr\",\"OfferingClass\":\"standard\",\"PurchaseOption\":\"Partial Upfront\"}},\"SB23J89QM4VUQ5AT.MZU6U2429S\":{\"priceDimensions\":{\"SB23J89QM4VUQ5AT.MZU6U2429S.2TG2D8R56U\":{\"unit\":\"Quantity\",\"description\":\"Upfront Fee\",\"appliesTo\":[],\"rateCode\":\"SB23J89QM4VUQ5AT.MZU6U2429S.2TG2D8R56U\",\"pricePerUnit\":{\"USD\":\"7797\"}},\"SB23J89QM4VUQ5AT.MZU6U2429S.6YS6EN2CT7\":{\"unit\":\"Hrs\",\"endRange\":\"Inf\",\"description\":\"USD 0.0 per Windows (Amazon VPC), m4.xlarge reserved instance applied\",\"appliesTo\":[],\"rateCode\":\"SB23J89QM4VUQ5AT.MZU6U2429S.6YS6EN2CT7\",\"beginRange\":\"0\",\"pricePerUnit\":{\"USD\":\"0.0000000000\"}}},\"sku\":\"SB23J89QM4VUQ5AT\",\"effectiveDate\":\"2017-04-30T23:59:59Z\",\"offerTermCode\":\"MZU6U2429S\",\"termAttributes\":{\"LeaseContractLength\":\"3yr\",\"OfferingClass\":\"convertible\",\"PurchaseOption\":\"All Upfront\"}},\"SB23J89QM4VUQ5AT.BPH4J8HBKS\":{\"priceDimensions\":{\"SB23J89QM4VUQ5AT.BPH4J8HBKS.6YS6EN2CT7\":{\"unit\":\"Hrs\",\"endRange\":\"Inf\",\"description\":\"Windows (Amazon VPC), m4.xlarge reserved instance applied\",\"appliesTo\":[],\"rateCode\":\"SB23J89QM4VUQ5AT.BPH4J8HBKS.6YS6EN2CT7\",\"beginRange\":\"0\",\"pricePerUnit\":{\"USD\":\"0.2920000000\"}}},\"sku\":\"SB23J89QM4VUQ5AT\",\"effectiveDate\":\"2017-04-30T23:59:59Z\",\"offerTermCode\":\"BPH4J8HBKS\",\"termAttributes\":{\"LeaseContractLength\":\"3yr\",\"OfferingClass\":\"standard\",\"PurchaseOption\":\"No Upfront\"}},\"SB23J89QM4VUQ5AT.NQ3QZPMQV9\":{\"priceDimensions\":{\"SB23J89QM4VUQ5AT.NQ3QZPMQV9.2TG2D8R56U\":{\"unit\":\"Quantity\",\"description\":\"Upfront Fee\",\"appliesTo\":[],\"rateCode\":\"SB23J89QM4VUQ5AT.NQ3QZPMQV9.2TG2D8R56U\",\"pricePerUnit\":{\"USD\":\"7306\"}},\"SB23J89QM4VUQ5AT.NQ3QZPMQV9.6YS6EN2CT7\":{\"unit\":\"Hrs\",\"endRange\":\"Inf\",\"description\":\"USD 0.0 per Windows (Amazon VPC), m4.xlarge reserved instance applied\",\"appliesTo\":[],\"rateCode\":\"SB23J89QM4VUQ5AT.NQ3QZPMQV9.6YS6EN2CT7\",\"beginRange\":\"0\",\"pricePerUnit\":{\"USD\":\"0.0000000000\"}}},\"sku\":\"SB23J89QM4VUQ5AT\",\"effectiveDate\":\"2017-04-30T23:59:59Z\",\"offerTermCode\":\"NQ3QZPMQV9\",\"termAttributes\":{\"LeaseContractLength\":\"3yr\",\"OfferingClass\":\"standard\",\"PurchaseOption\":\"All Upfront\"}},\"SB23J89QM4VUQ5AT.CUZHX8X6JH\":{\"priceDimensions\":{\"SB23J89QM4VUQ5AT.CUZHX8X6JH.6YS6EN2CT7\":{\"unit\":\"Hrs\",\"endRange\":\"Inf\",\"description\":\"Windows (Amazon VPC), m4.xlarge reserved instance applied\",\"appliesTo\":[],\"rateCode\":\"SB23J89QM4VUQ5AT.CUZHX8X6JH.6YS6EN2CT7\",\"beginRange\":\"0\",\"pricePerUnit\":{\"USD\":\"0.1748000000\"}},\"SB23J89QM4VUQ5AT.CUZHX8X6JH.2TG2D8R56U\":{\"unit\":\"Quantity\",\"description\":\"Upfront Fee\",\"appliesTo\":[],\"rateCode\":\"SB23J89QM4VUQ5AT.CUZHX8X6JH.2TG2D8R56U\",\"pricePerUnit\":{\"USD\":\"1531\"}}},\"sku\":\"SB23J89QM4VUQ5AT\",\"effectiveDate\":\"2017-10-31T23:59:59Z\",\"offerTermCode\":\"CUZHX8X6JH\",\"termAttributes\":{\"LeaseContractLength\":\"1yr\",\"OfferingClass\":\"convertible\",\"PurchaseOption\":\"Partial Upfront\"}},\"SB23J89QM4VUQ5AT.Z2E3P23VKM\":{\"priceDimensions\":{\"SB23J89QM4VUQ5AT.Z2E3P23VKM.6YS6EN2CT7\":{\"unit\":\"Hrs\",\"endRange\":\"Inf\",\"description\":\"Windows (Amazon VPC), m4.xlarge reserved instance applied\",\"appliesTo\":[],\"rateCode\":\"SB23J89QM4VUQ5AT.Z2E3P23VKM.6YS6EN2CT7\",\"beginRange\":\"0\",\"pricePerUnit\":{\"USD\":\"0.3082000000\"}}},\"sku\":\"SB23J89QM4VUQ5AT\",\"effectiveDate\":\"2017-04-30T23:59:59Z\",\"offerTermCode\":\"Z2E3P23VKM\",\"termAttributes\":{\"LeaseContractLength\":\"3yr\",\"OfferingClass\":\"convertible\",\"PurchaseOption\":\"No Upfront\"}},\"SB23J89QM4VUQ5AT.7NE97W5U4E\":{\"priceDimensions\":{\"SB23J89QM4VUQ5AT.7NE97W5U4E.6YS6EN2CT7\":{\"unit\":\"Hrs\",\"endRange\":\"Inf\",\"description\":\"Windows (Amazon VPC), m4.xlarge reserved instance applied\",\"appliesTo\":[],\"rateCode\":\"SB23J89QM4VUQ5AT.7NE97W5U4E.6YS6EN2CT7\",\"beginRange\":\"0\",\"pricePerUnit\":{\"USD\":\"0.3579000000\"}}},\"sku\":\"SB23J89QM4VUQ5AT\",\"effectiveDate\":\"2017-10-31T23:59:59Z\",\"offerTermCode\":\"7NE97W5U4E\",\"termAttributes\":{\"LeaseContractLength\":\"1yr\",\"OfferingClass\":\"convertible\",\"PurchaseOption\":\"No Upfront\"}},\"SB23J89QM4VUQ5AT.R5XV2EPZQZ\":{\"priceDimensions\":{\"SB23J89QM4VUQ5AT.R5XV2EPZQZ.2TG2D8R56U\":{\"unit\":\"Quantity\",\"description\":\"Upfront Fee\",\"appliesTo\":[],\"rateCode\":\"SB23J89QM4VUQ5AT.R5XV2EPZQZ.2TG2D8R56U\",\"pricePerUnit\":{\"USD\":\"3929\"}},\"SB23J89QM4VUQ5AT.R5XV2EPZQZ.6YS6EN2CT7\":{\"unit\":\"Hrs\",\"endRange\":\"Inf\",\"description\":\"Windows (Amazon VPC), m4.xlarge reserved instance applied\",\"appliesTo\":[],\"rateCode\":\"SB23J89QM4VUQ5AT.R5XV2EPZQZ.6YS6EN2CT7\",\"beginRange\":\"0\",\"pricePerUnit\":{\"USD\":\"0.1495000000\"}}},\"sku\":\"SB23J89QM4VUQ5AT\",\"effectiveDate\":\"2017-04-30T23:59:59Z\",\"offerTermCode\":\"R5XV2EPZQZ\",\"termAttributes\":{\"LeaseContractLength\":\"3yr\",\"OfferingClass\":\"convertible\",\"PurchaseOption\":\"Partial Upfront\"}}}},\"version\":\"20190116212448\",\"publicationDate\":\"2019-01-16T21:24:48Z\"}", + "{\"product\":{\"productFamily\":\"Compute Instance\",\"attributes\":{\"enhancedNetworkingSupported\":\"Yes\",\"memory\":\"16 GiB\",\"dedicatedEbsThroughput\":\"750 Mbps\",\"vcpu\":\"4\",\"capacitystatus\":\"Used\",\"locationType\":\"AWS Region\",\"storage\":\"EBS only\",\"instanceFamily\":\"General purpose\",\"operatingSystem\":\"RHEL\",\"physicalProcessor\":\"Intel Xeon E5-2676 v3 (Haswell)\",\"clockSpeed\":\"2.4 GHz\",\"ecu\":\"13\",\"networkPerformance\":\"High\",\"servicename\":\"Amazon Elastic Compute Cloud\",\"instanceType\":\"m4.xlarge\",\"tenancy\":\"Host\",\"usagetype\":\"EU-HostBoxUsage:m4.xlarge\",\"normalizationSizeFactor\":\"8\",\"processorFeatures\":\"Intel AVX; Intel AVX2; Intel Turbo\",\"servicecode\":\"AmazonEC2\",\"licenseModel\":\"No License required\",\"currentGeneration\":\"Yes\",\"preInstalledSw\":\"NA\",\"location\":\"EU (Ireland)\",\"processorArchitecture\":\"64-bit\",\"operation\":\"RunInstances:0010\"},\"sku\":\"TD747NNS7HFVAC78\"},\"serviceCode\":\"AmazonEC2\",\"terms\":{\"OnDemand\":{\"TD747NNS7HFVAC78.JRTCKXETXF\":{\"priceDimensions\":{\"TD747NNS7HFVAC78.JRTCKXETXF.6YS6EN2CT7\":{\"unit\":\"Hrs\",\"endRange\":\"Inf\",\"description\":\"$0.000 per RHEL m4.xlarge Dedicated Host Instance hour\",\"appliesTo\":[],\"rateCode\":\"TD747NNS7HFVAC78.JRTCKXETXF.6YS6EN2CT7\",\"beginRange\":\"0\",\"pricePerUnit\":{\"USD\":\"0.0000000000\"}}},\"sku\":\"TD747NNS7HFVAC78\",\"effectiveDate\":\"2019-01-01T00:00:00Z\",\"offerTermCode\":\"JRTCKXETXF\",\"termAttributes\":{}}}},\"version\":\"20190116212448\",\"publicationDate\":\"2019-01-16T21:24:48Z\"}", + "{\"product\":{\"productFamily\":\"Compute Instance\",\"attributes\":{\"enhancedNetworkingSupported\":\"Yes\",\"memory\":\"16 GiB\",\"dedicatedEbsThroughput\":\"750 Mbps\",\"vcpu\":\"4\",\"capacitystatus\":\"Used\",\"locationType\":\"AWS Region\",\"storage\":\"EBS only\",\"instanceFamily\":\"General purpose\",\"operatingSystem\":\"Windows\",\"physicalProcessor\":\"Intel Xeon E5-2676 v3 (Haswell)\",\"clockSpeed\":\"2.4 GHz\",\"ecu\":\"13\",\"networkPerformance\":\"High\",\"servicename\":\"Amazon Elastic Compute Cloud\",\"instanceType\":\"m4.xlarge\",\"tenancy\":\"Host\",\"usagetype\":\"EU-HostBoxUsage:m4.xlarge\",\"normalizationSizeFactor\":\"8\",\"processorFeatures\":\"Intel AVX; Intel AVX2; Intel Turbo\",\"servicecode\":\"AmazonEC2\",\"licenseModel\":\"Bring your own license\",\"currentGeneration\":\"Yes\",\"preInstalledSw\":\"NA\",\"location\":\"EU (Ireland)\",\"processorArchitecture\":\"64-bit\",\"operation\":\"RunInstances:0800\"},\"sku\":\"VQP4ARZ9PSE77WTX\"},\"serviceCode\":\"AmazonEC2\",\"terms\":{\"OnDemand\":{\"VQP4ARZ9PSE77WTX.JRTCKXETXF\":{\"priceDimensions\":{\"VQP4ARZ9PSE77WTX.JRTCKXETXF.6YS6EN2CT7\":{\"unit\":\"Hrs\",\"endRange\":\"Inf\",\"description\":\"$0.000 per Windows BYOL m4.xlarge Dedicated Host Instance hour\",\"appliesTo\":[],\"rateCode\":\"VQP4ARZ9PSE77WTX.JRTCKXETXF.6YS6EN2CT7\",\"beginRange\":\"0\",\"pricePerUnit\":{\"USD\":\"0.0000000000\"}}},\"sku\":\"VQP4ARZ9PSE77WTX\",\"effectiveDate\":\"2019-01-01T00:00:00Z\",\"offerTermCode\":\"JRTCKXETXF\",\"termAttributes\":{}}}},\"version\":\"20190116212448\",\"publicationDate\":\"2019-01-16T21:24:48Z\"}", + "{\"product\":{\"productFamily\":\"Compute Instance\",\"attributes\":{\"enhancedNetworkingSupported\":\"Yes\",\"memory\":\"16 GiB\",\"dedicatedEbsThroughput\":\"750 Mbps\",\"vcpu\":\"4\",\"capacitystatus\":\"Used\",\"locationType\":\"AWS Region\",\"storage\":\"EBS only\",\"instanceFamily\":\"General purpose\",\"operatingSystem\":\"SUSE\",\"physicalProcessor\":\"Intel Xeon E5-2676 v3 (Haswell)\",\"clockSpeed\":\"2.4 GHz\",\"ecu\":\"13\",\"networkPerformance\":\"High\",\"servicename\":\"Amazon Elastic Compute Cloud\",\"instanceType\":\"m4.xlarge\",\"tenancy\":\"Host\",\"usagetype\":\"EU-HostBoxUsage:m4.xlarge\",\"normalizationSizeFactor\":\"8\",\"processorFeatures\":\"Intel AVX; Intel AVX2; Intel Turbo\",\"servicecode\":\"AmazonEC2\",\"licenseModel\":\"No License required\",\"currentGeneration\":\"Yes\",\"preInstalledSw\":\"NA\",\"location\":\"EU (Ireland)\",\"processorArchitecture\":\"64-bit\",\"operation\":\"RunInstances:000g\"},\"sku\":\"XKU4NDDFXPHHTKAN\"},\"serviceCode\":\"AmazonEC2\",\"terms\":{\"OnDemand\":{\"XKU4NDDFXPHHTKAN.JRTCKXETXF\":{\"priceDimensions\":{\"XKU4NDDFXPHHTKAN.JRTCKXETXF.6YS6EN2CT7\":{\"unit\":\"Hrs\",\"endRange\":\"Inf\",\"description\":\"$0.000 per SUSE m4.xlarge Dedicated Host Instance hour\",\"appliesTo\":[],\"rateCode\":\"XKU4NDDFXPHHTKAN.JRTCKXETXF.6YS6EN2CT7\",\"beginRange\":\"0\",\"pricePerUnit\":{\"USD\":\"0.0000000000\"}}},\"sku\":\"XKU4NDDFXPHHTKAN\",\"effectiveDate\":\"2019-01-01T00:00:00Z\",\"offerTermCode\":\"JRTCKXETXF\",\"termAttributes\":{}}}},\"version\":\"20190116212448\",\"publicationDate\":\"2019-01-16T21:24:48Z\"}" + ], + "FormatVersion": "aws_v1" +} diff --git a/cluster-autoscaler/cloudprovider/aws/aws_cloud_provider.go b/cluster-autoscaler/cloudprovider/aws/aws_cloud_provider.go index d790188f41bb..c69224fa812a 100644 --- a/cluster-autoscaler/cloudprovider/aws/aws_cloud_provider.go +++ b/cluster-autoscaler/cloudprovider/aws/aws_cloud_provider.go @@ -23,7 +23,9 @@ import ( "regexp" "strings" + awssdk "github.com/aws/aws-sdk-go/aws" "github.com/aws/aws-sdk-go/aws/session" + goerrors "github.com/pkg/errors" apiv1 "k8s.io/api/core/v1" "k8s.io/apimachinery/pkg/api/resource" "k8s.io/autoscaler/cluster-autoscaler/cloudprovider" @@ -103,7 +105,16 @@ func (aws *awsCloudProvider) NodeGroupForNode(node *apiv1.Node) (cloudprovider.N // Pricing returns pricing model for this cloud provider or error if not available. func (aws *awsCloudProvider) Pricing() (cloudprovider.PricingModel, errors.AutoscalerError) { - return NewPriceModel(aws.awsManager, price.NewDescriptor(session.New())), nil + sess, err := session.NewSession(&awssdk.Config{ + Region: awssdk.String("us-east-1"), + }) + + if err != nil { + err = goerrors.Wrap(err, "could not create AWS session") + return nil, errors.ToAutoscalerError(errors.InternalError, err) + } + + return NewPriceModel(aws.awsManager, price.NewDescriptor(sess)), nil } // GetAvailableMachineTypes get all machine types that can be requested from the cloud provider. diff --git a/cluster-autoscaler/cloudprovider/aws/price/descriptor.go b/cluster-autoscaler/cloudprovider/aws/price/descriptor.go index a927e42a5d9f..890cd20ac8e0 100644 --- a/cluster-autoscaler/cloudprovider/aws/price/descriptor.go +++ b/cluster-autoscaler/cloudprovider/aws/price/descriptor.go @@ -17,11 +17,10 @@ limitations under the License. package price import ( - "net/http" - "github.com/aws/aws-sdk-go/aws/session" "github.com/aws/aws-sdk-go/service/autoscaling" "github.com/aws/aws-sdk-go/service/ec2" + "github.com/aws/aws-sdk-go/service/pricing" "k8s.io/autoscaler/cluster-autoscaler/cloudprovider/aws/api" "k8s.io/autoscaler/cluster-autoscaler/cloudprovider/aws/price/ondemand" "k8s.io/autoscaler/cluster-autoscaler/cloudprovider/aws/price/spot" @@ -47,7 +46,7 @@ func NewDescriptor(s *session.Session) *shapeDescriptor { autoscaling: api.NewEC2AutoscalingService(as), launchConfiguration: api.NewEC2LaunchConfigurationService(as), spot: spot.NewDescriptor(api.NewEC2SpotPriceService(ec2.New(s))), - onDemand: ondemand.NewDescriptor(api.NewEC2InstanceInfoService(http.DefaultClient)), + onDemand: ondemand.NewDescriptor(api.NewEC2InstanceInfoService(pricing.New(s))), } } diff --git a/cluster-autoscaler/cloudprovider/aws/price/spot/descriptor.go b/cluster-autoscaler/cloudprovider/aws/price/spot/descriptor.go index 150bb3b0351a..321557a78344 100644 --- a/cluster-autoscaler/cloudprovider/aws/price/spot/descriptor.go +++ b/cluster-autoscaler/cloudprovider/aws/price/spot/descriptor.go @@ -21,8 +21,8 @@ import ( "strings" "time" - "github.com/golang/glog" "k8s.io/autoscaler/cluster-autoscaler/cloudprovider/aws/api" + "k8s.io/klog" ) const ( @@ -136,7 +136,7 @@ func (d *descriptor) maxSpotPriceForDuration(instanceType string, availabilityZo if maxPrice == 0.0 { item, _ := history.LastItem() - glog.Warningf( + klog.Warningf( "no spot price information newer than %s, using last known price of %f which is %s old", lookupWindow, item.Price, @@ -154,7 +154,7 @@ func (d *descriptor) spotPriceHistory(instanceType, availabilityZone string) (*H return nil, fmt.Errorf("spot price sync failed: %v", err) } } - glog.V(5).Infof("price history successfully synchronized for %s in AZ %s", instanceType, availabilityZone) + klog.V(5).Infof("price history successfully synchronized for %s in AZ %s", instanceType, availabilityZone) instanceZone := instanceTypeInZone{instanceType: instanceType, availabilityZone: availabilityZone} return d.bucket[instanceZone], nil diff --git a/cluster-autoscaler/cloudprovider/aws/price/spot/history.go b/cluster-autoscaler/cloudprovider/aws/price/spot/history.go index edf51e64265d..7402678381d9 100644 --- a/cluster-autoscaler/cloudprovider/aws/price/spot/history.go +++ b/cluster-autoscaler/cloudprovider/aws/price/spot/history.go @@ -23,8 +23,8 @@ import ( "errors" - "github.com/golang/glog" "k8s.io/autoscaler/cluster-autoscaler/cloudprovider/aws/api" + "k8s.io/klog" ) // ErrEmptySpotPriceHistory implements the error interface @@ -64,7 +64,7 @@ func (h *History) Len() int { func (h *History) Housekeep() { lastItem, err := h.LastItem() if err != nil { - glog.Warningf("no last item found, price history is empty - exit housekeeping") + klog.Warningf("no last item found, price history is empty - exit housekeeping") return } @@ -85,7 +85,7 @@ func (h *History) Housekeep() { if len(c) == 0 { c = append(c, lastItem) - glog.V(5).Infof("cleaned history was empty, last price has been inserted back - age: %v", time.Now().Sub(lastItem.Timestamp)) + klog.V(5).Infof("cleaned history was empty, last price has been inserted back - age: %v", time.Now().Sub(lastItem.Timestamp)) } sort.Sort(c) diff --git a/cluster-autoscaler/expander/price/price.go b/cluster-autoscaler/expander/price/price.go index c8ba8a869e12..c59bd2847884 100644 --- a/cluster-autoscaler/expander/price/price.go +++ b/cluster-autoscaler/expander/price/price.go @@ -151,7 +151,8 @@ nextoption: optionScore *= notExistCoeficient } - debug := fmt.Sprintf("all_nodes_price=%f pods_price=%f stabilized_ratio=%f unfitness=%f suppressed=%f final_score=%f", + debug := fmt.Sprintf("node_price=%f all_nodes_price=%f pods_price=%f stabilized_ratio=%f unfitness=%f suppressed=%f final_score=%f", + nodePrice, totalNodePrice, totalPodPrice, priceSubScore, diff --git a/cluster-autoscaler/kubernetes.sync b/cluster-autoscaler/kubernetes.sync index a7f2bfa964be..cdfebd00cdab 100644 --- a/cluster-autoscaler/kubernetes.sync +++ b/cluster-autoscaler/kubernetes.sync @@ -1,5 +1,7 @@ -commit 416974b8346bb1c219efe871c18a9f29de4fad2d (origin/master, origin/HEAD) -Author: Anago GCB -Date: Mon Nov 26 14:16:47 2018 +0000 +Merge: abc71e373f d4ff786eb0 +Author: Kubernetes Prow Robot +Date: Tue Jan 8 23:56:01 2019 -0800 - Update CHANGELOG-1.12.md for v1.12.3. + Merge pull request #72668 from ixdy/automated-cherry-pick-of-#72173-#72218-release-1.13 + + Automated cherry pick of #72173: make integration/verify script look for k8s under GOPATH #72218: Clean up artifacts variables in hack scripts diff --git a/cluster-autoscaler/vendor/github.com/aws/aws-sdk-go/service/pricing/api.go b/cluster-autoscaler/vendor/github.com/aws/aws-sdk-go/service/pricing/api.go new file mode 100644 index 000000000000..f5be2db265a1 --- /dev/null +++ b/cluster-autoscaler/vendor/github.com/aws/aws-sdk-go/service/pricing/api.go @@ -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" +) diff --git a/cluster-autoscaler/vendor/github.com/aws/aws-sdk-go/service/pricing/doc.go b/cluster-autoscaler/vendor/github.com/aws/aws-sdk-go/service/pricing/doc.go new file mode 100644 index 000000000000..0555bc4c3cb3 --- /dev/null +++ b/cluster-autoscaler/vendor/github.com/aws/aws-sdk-go/service/pricing/doc.go @@ -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 diff --git a/cluster-autoscaler/vendor/github.com/aws/aws-sdk-go/service/pricing/errors.go b/cluster-autoscaler/vendor/github.com/aws/aws-sdk-go/service/pricing/errors.go new file mode 100644 index 000000000000..10e4c44fe929 --- /dev/null +++ b/cluster-autoscaler/vendor/github.com/aws/aws-sdk-go/service/pricing/errors.go @@ -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" +) diff --git a/cluster-autoscaler/vendor/github.com/aws/aws-sdk-go/service/pricing/service.go b/cluster-autoscaler/vendor/github.com/aws/aws-sdk-go/service/pricing/service.go new file mode 100644 index 000000000000..90ff33d0a084 --- /dev/null +++ b/cluster-autoscaler/vendor/github.com/aws/aws-sdk-go/service/pricing/service.go @@ -0,0 +1,100 @@ +// 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" // Name of service. + EndpointsID = ServiceName // ID to lookup a service endpoint with. + ServiceID = "Pricing" // ServiceID is a unique identifer of a specific service. +) + +// 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, + ServiceID: ServiceID, + 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 +} diff --git a/cluster-autoscaler/vendor/github.com/golang/glog/LICENSE b/cluster-autoscaler/vendor/github.com/golang/glog/LICENSE new file mode 100644 index 000000000000..37ec93a14fdc --- /dev/null +++ b/cluster-autoscaler/vendor/github.com/golang/glog/LICENSE @@ -0,0 +1,191 @@ +Apache License +Version 2.0, January 2004 +http://www.apache.org/licenses/ + +TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + +1. Definitions. + +"License" shall mean the terms and conditions for use, reproduction, and +distribution as defined by Sections 1 through 9 of this document. + +"Licensor" shall mean the copyright owner or entity authorized by the copyright +owner that is granting the License. + +"Legal Entity" shall mean the union of the acting entity and all other entities +that control, are controlled by, or are under common control with that entity. +For the purposes of this definition, "control" means (i) the power, direct or +indirect, to cause the direction or management of such entity, whether by +contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the +outstanding shares, or (iii) beneficial ownership of such entity. + +"You" (or "Your") shall mean an individual or Legal Entity exercising +permissions granted by this License. + +"Source" form shall mean the preferred form for making modifications, including +but not limited to software source code, documentation source, and configuration +files. + +"Object" form shall mean any form resulting from mechanical transformation or +translation of a Source form, including but not limited to compiled object code, +generated documentation, and conversions to other media types. + +"Work" shall mean the work of authorship, whether in Source or Object form, made +available under the License, as indicated by a copyright notice that is included +in or attached to the work (an example is provided in the Appendix below). + +"Derivative Works" shall mean any work, whether in Source or Object form, that +is based on (or derived from) the Work and for which the editorial revisions, +annotations, elaborations, or other modifications represent, as a whole, an +original work of authorship. For the purposes of this License, Derivative Works +shall not include works that remain separable from, or merely link (or bind by +name) to the interfaces of, the Work and Derivative Works thereof. + +"Contribution" shall mean any work of authorship, including the original version +of the Work and any modifications or additions to that Work or Derivative Works +thereof, that is intentionally submitted to Licensor for inclusion in the Work +by the copyright owner or by an individual or Legal Entity authorized to submit +on behalf of the copyright owner. For the purposes of this definition, +"submitted" means any form of electronic, verbal, or written communication sent +to the Licensor or its representatives, including but not limited to +communication on electronic mailing lists, source code control systems, and +issue tracking systems that are managed by, or on behalf of, the Licensor for +the purpose of discussing and improving the Work, but excluding communication +that is conspicuously marked or otherwise designated in writing by the copyright +owner as "Not a Contribution." + +"Contributor" shall mean Licensor and any individual or Legal Entity on behalf +of whom a Contribution has been received by Licensor and subsequently +incorporated within the Work. + +2. Grant of Copyright License. + +Subject to the terms and conditions of this License, each Contributor hereby +grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, +irrevocable copyright license to reproduce, prepare Derivative Works of, +publicly display, publicly perform, sublicense, and distribute the Work and such +Derivative Works in Source or Object form. + +3. Grant of Patent License. + +Subject to the terms and conditions of this License, each Contributor hereby +grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, +irrevocable (except as stated in this section) patent license to make, have +made, use, offer to sell, sell, import, and otherwise transfer the Work, where +such license applies only to those patent claims licensable by such Contributor +that are necessarily infringed by their Contribution(s) alone or by combination +of their Contribution(s) with the Work to which such Contribution(s) was +submitted. If You institute patent litigation against any entity (including a +cross-claim or counterclaim in a lawsuit) alleging that the Work or a +Contribution incorporated within the Work constitutes direct or contributory +patent infringement, then any patent licenses granted to You under this License +for that Work shall terminate as of the date such litigation is filed. + +4. Redistribution. + +You may reproduce and distribute copies of the Work or Derivative Works thereof +in any medium, with or without modifications, and in Source or Object form, +provided that You meet the following conditions: + +You must give any other recipients of the Work or Derivative Works a copy of +this License; and +You must cause any modified files to carry prominent notices stating that You +changed the files; and +You must retain, in the Source form of any Derivative Works that You distribute, +all copyright, patent, trademark, and attribution notices from the Source form +of the Work, excluding those notices that do not pertain to any part of the +Derivative Works; and +If the Work includes a "NOTICE" text file as part of its distribution, then any +Derivative Works that You distribute must include a readable copy of the +attribution notices contained within such NOTICE file, excluding those notices +that do not pertain to any part of the Derivative Works, in at least one of the +following places: within a NOTICE text file distributed as part of the +Derivative Works; within the Source form or documentation, if provided along +with the Derivative Works; or, within a display generated by the Derivative +Works, if and wherever such third-party notices normally appear. The contents of +the NOTICE file are for informational purposes only and do not modify the +License. You may add Your own attribution notices within Derivative Works that +You distribute, alongside or as an addendum to the NOTICE text from the Work, +provided that such additional attribution notices cannot be construed as +modifying the License. +You may add Your own copyright statement to Your modifications and may provide +additional or different license terms and conditions for use, reproduction, or +distribution of Your modifications, or for any such Derivative Works as a whole, +provided Your use, reproduction, and distribution of the Work otherwise complies +with the conditions stated in this License. + +5. Submission of Contributions. + +Unless You explicitly state otherwise, any Contribution intentionally submitted +for inclusion in the Work by You to the Licensor shall be under the terms and +conditions of this License, without any additional terms or conditions. +Notwithstanding the above, nothing herein shall supersede or modify the terms of +any separate license agreement you may have executed with Licensor regarding +such Contributions. + +6. Trademarks. + +This License does not grant permission to use the trade names, trademarks, +service marks, or product names of the Licensor, except as required for +reasonable and customary use in describing the origin of the Work and +reproducing the content of the NOTICE file. + +7. Disclaimer of Warranty. + +Unless required by applicable law or agreed to in writing, Licensor provides the +Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, +including, without limitation, any warranties or conditions of TITLE, +NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are +solely responsible for determining the appropriateness of using or +redistributing the Work and assume any risks associated with Your exercise of +permissions under this License. + +8. Limitation of Liability. + +In no event and under no legal theory, whether in tort (including negligence), +contract, or otherwise, unless required by applicable law (such as deliberate +and grossly negligent acts) or agreed to in writing, shall any Contributor be +liable to You for damages, including any direct, indirect, special, incidental, +or consequential damages of any character arising as a result of this License or +out of the use or inability to use the Work (including but not limited to +damages for loss of goodwill, work stoppage, computer failure or malfunction, or +any and all other commercial damages or losses), even if such Contributor has +been advised of the possibility of such damages. + +9. Accepting Warranty or Additional Liability. + +While redistributing the Work or Derivative Works thereof, You may choose to +offer, and charge a fee for, acceptance of support, warranty, indemnity, or +other liability obligations and/or rights consistent with this License. However, +in accepting such obligations, You may act only on Your own behalf and on Your +sole responsibility, not on behalf of any other Contributor, and only if You +agree to indemnify, defend, and hold each Contributor harmless for any liability +incurred by, or claims asserted against, such Contributor by reason of your +accepting any such warranty or additional liability. + +END OF TERMS AND CONDITIONS + +APPENDIX: How to apply the Apache License to your work + +To apply the Apache License to your work, attach the following boilerplate +notice, with the fields enclosed by brackets "[]" replaced with your own +identifying information. (Don't include the brackets!) The text should be +enclosed in the appropriate comment syntax for the file format. We also +recommend that a file or class name and description of purpose be included on +the same "printed page" as the copyright notice for easier identification within +third-party archives. + + Copyright [yyyy] [name of copyright owner] + + 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. diff --git a/cluster-autoscaler/vendor/github.com/golang/glog/README b/cluster-autoscaler/vendor/github.com/golang/glog/README new file mode 100644 index 000000000000..387b4eb68909 --- /dev/null +++ b/cluster-autoscaler/vendor/github.com/golang/glog/README @@ -0,0 +1,44 @@ +glog +==== + +Leveled execution logs for Go. + +This is an efficient pure Go implementation of leveled logs in the +manner of the open source C++ package + https://github.com/google/glog + +By binding methods to booleans it is possible to use the log package +without paying the expense of evaluating the arguments to the log. +Through the -vmodule flag, the package also provides fine-grained +control over logging at the file level. + +The comment from glog.go introduces the ideas: + + Package glog implements logging analogous to the Google-internal + C++ INFO/ERROR/V setup. It provides functions Info, Warning, + Error, Fatal, plus formatting variants such as Infof. It + also provides V-style logging controlled by the -v and + -vmodule=file=2 flags. + + Basic examples: + + glog.Info("Prepare to repel boarders") + + glog.Fatalf("Initialization failed: %s", err) + + See the documentation for the V function for an explanation + of these examples: + + if glog.V(2) { + glog.Info("Starting transaction...") + } + + glog.V(2).Infoln("Processed", nItems, "elements") + + +The repository contains an open source version of the log package +used inside Google. The master copy of the source lives inside +Google, not here. The code in this repo is for export only and is not itself +under development. Feature requests will be ignored. + +Send bug reports to golang-nuts@googlegroups.com. diff --git a/cluster-autoscaler/vendor/github.com/golang/glog/glog.go b/cluster-autoscaler/vendor/github.com/golang/glog/glog.go new file mode 100644 index 000000000000..54bd7afdcabe --- /dev/null +++ b/cluster-autoscaler/vendor/github.com/golang/glog/glog.go @@ -0,0 +1,1180 @@ +// Go support for leveled logs, analogous to https://code.google.com/p/google-glog/ +// +// Copyright 2013 Google Inc. 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. +// 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 glog implements logging analogous to the Google-internal C++ INFO/ERROR/V setup. +// It provides functions Info, Warning, Error, Fatal, plus formatting variants such as +// Infof. It also provides V-style logging controlled by the -v and -vmodule=file=2 flags. +// +// Basic examples: +// +// glog.Info("Prepare to repel boarders") +// +// glog.Fatalf("Initialization failed: %s", err) +// +// See the documentation for the V function for an explanation of these examples: +// +// if glog.V(2) { +// glog.Info("Starting transaction...") +// } +// +// glog.V(2).Infoln("Processed", nItems, "elements") +// +// Log output is buffered and written periodically using Flush. Programs +// should call Flush before exiting to guarantee all log output is written. +// +// By default, all log statements write to files in a temporary directory. +// This package provides several flags that modify this behavior. +// As a result, flag.Parse must be called before any logging is done. +// +// -logtostderr=false +// Logs are written to standard error instead of to files. +// -alsologtostderr=false +// Logs are written to standard error as well as to files. +// -stderrthreshold=ERROR +// Log events at or above this severity are logged to standard +// error as well as to files. +// -log_dir="" +// Log files will be written to this directory instead of the +// default temporary directory. +// +// Other flags provide aids to debugging. +// +// -log_backtrace_at="" +// When set to a file and line number holding a logging statement, +// such as +// -log_backtrace_at=gopherflakes.go:234 +// a stack trace will be written to the Info log whenever execution +// hits that statement. (Unlike with -vmodule, the ".go" must be +// present.) +// -v=0 +// Enable V-leveled logging at the specified level. +// -vmodule="" +// The syntax of the argument is a comma-separated list of pattern=N, +// where pattern is a literal file name (minus the ".go" suffix) or +// "glob" pattern and N is a V level. For instance, +// -vmodule=gopher*=3 +// sets the V level to 3 in all Go files whose names begin "gopher". +// +package glog + +import ( + "bufio" + "bytes" + "errors" + "flag" + "fmt" + "io" + stdLog "log" + "os" + "path/filepath" + "runtime" + "strconv" + "strings" + "sync" + "sync/atomic" + "time" +) + +// severity identifies the sort of log: info, warning etc. It also implements +// the flag.Value interface. The -stderrthreshold flag is of type severity and +// should be modified only through the flag.Value interface. The values match +// the corresponding constants in C++. +type severity int32 // sync/atomic int32 + +// These constants identify the log levels in order of increasing severity. +// A message written to a high-severity log file is also written to each +// lower-severity log file. +const ( + infoLog severity = iota + warningLog + errorLog + fatalLog + numSeverity = 4 +) + +const severityChar = "IWEF" + +var severityName = []string{ + infoLog: "INFO", + warningLog: "WARNING", + errorLog: "ERROR", + fatalLog: "FATAL", +} + +// get returns the value of the severity. +func (s *severity) get() severity { + return severity(atomic.LoadInt32((*int32)(s))) +} + +// set sets the value of the severity. +func (s *severity) set(val severity) { + atomic.StoreInt32((*int32)(s), int32(val)) +} + +// String is part of the flag.Value interface. +func (s *severity) String() string { + return strconv.FormatInt(int64(*s), 10) +} + +// Get is part of the flag.Value interface. +func (s *severity) Get() interface{} { + return *s +} + +// Set is part of the flag.Value interface. +func (s *severity) Set(value string) error { + var threshold severity + // Is it a known name? + if v, ok := severityByName(value); ok { + threshold = v + } else { + v, err := strconv.Atoi(value) + if err != nil { + return err + } + threshold = severity(v) + } + logging.stderrThreshold.set(threshold) + return nil +} + +func severityByName(s string) (severity, bool) { + s = strings.ToUpper(s) + for i, name := range severityName { + if name == s { + return severity(i), true + } + } + return 0, false +} + +// OutputStats tracks the number of output lines and bytes written. +type OutputStats struct { + lines int64 + bytes int64 +} + +// Lines returns the number of lines written. +func (s *OutputStats) Lines() int64 { + return atomic.LoadInt64(&s.lines) +} + +// Bytes returns the number of bytes written. +func (s *OutputStats) Bytes() int64 { + return atomic.LoadInt64(&s.bytes) +} + +// Stats tracks the number of lines of output and number of bytes +// per severity level. Values must be read with atomic.LoadInt64. +var Stats struct { + Info, Warning, Error OutputStats +} + +var severityStats = [numSeverity]*OutputStats{ + infoLog: &Stats.Info, + warningLog: &Stats.Warning, + errorLog: &Stats.Error, +} + +// Level is exported because it appears in the arguments to V and is +// the type of the v flag, which can be set programmatically. +// It's a distinct type because we want to discriminate it from logType. +// Variables of type level are only changed under logging.mu. +// The -v flag is read only with atomic ops, so the state of the logging +// module is consistent. + +// Level is treated as a sync/atomic int32. + +// Level specifies a level of verbosity for V logs. *Level implements +// flag.Value; the -v flag is of type Level and should be modified +// only through the flag.Value interface. +type Level int32 + +// get returns the value of the Level. +func (l *Level) get() Level { + return Level(atomic.LoadInt32((*int32)(l))) +} + +// set sets the value of the Level. +func (l *Level) set(val Level) { + atomic.StoreInt32((*int32)(l), int32(val)) +} + +// String is part of the flag.Value interface. +func (l *Level) String() string { + return strconv.FormatInt(int64(*l), 10) +} + +// Get is part of the flag.Value interface. +func (l *Level) Get() interface{} { + return *l +} + +// Set is part of the flag.Value interface. +func (l *Level) Set(value string) error { + v, err := strconv.Atoi(value) + if err != nil { + return err + } + logging.mu.Lock() + defer logging.mu.Unlock() + logging.setVState(Level(v), logging.vmodule.filter, false) + return nil +} + +// moduleSpec represents the setting of the -vmodule flag. +type moduleSpec struct { + filter []modulePat +} + +// modulePat contains a filter for the -vmodule flag. +// It holds a verbosity level and a file pattern to match. +type modulePat struct { + pattern string + literal bool // The pattern is a literal string + level Level +} + +// match reports whether the file matches the pattern. It uses a string +// comparison if the pattern contains no metacharacters. +func (m *modulePat) match(file string) bool { + if m.literal { + return file == m.pattern + } + match, _ := filepath.Match(m.pattern, file) + return match +} + +func (m *moduleSpec) String() string { + // Lock because the type is not atomic. TODO: clean this up. + logging.mu.Lock() + defer logging.mu.Unlock() + var b bytes.Buffer + for i, f := range m.filter { + if i > 0 { + b.WriteRune(',') + } + fmt.Fprintf(&b, "%s=%d", f.pattern, f.level) + } + return b.String() +} + +// Get is part of the (Go 1.2) flag.Getter interface. It always returns nil for this flag type since the +// struct is not exported. +func (m *moduleSpec) Get() interface{} { + return nil +} + +var errVmoduleSyntax = errors.New("syntax error: expect comma-separated list of filename=N") + +// Syntax: -vmodule=recordio=2,file=1,gfs*=3 +func (m *moduleSpec) Set(value string) error { + var filter []modulePat + for _, pat := range strings.Split(value, ",") { + if len(pat) == 0 { + // Empty strings such as from a trailing comma can be ignored. + continue + } + patLev := strings.Split(pat, "=") + if len(patLev) != 2 || len(patLev[0]) == 0 || len(patLev[1]) == 0 { + return errVmoduleSyntax + } + pattern := patLev[0] + v, err := strconv.Atoi(patLev[1]) + if err != nil { + return errors.New("syntax error: expect comma-separated list of filename=N") + } + if v < 0 { + return errors.New("negative value for vmodule level") + } + if v == 0 { + continue // Ignore. It's harmless but no point in paying the overhead. + } + // TODO: check syntax of filter? + filter = append(filter, modulePat{pattern, isLiteral(pattern), Level(v)}) + } + logging.mu.Lock() + defer logging.mu.Unlock() + logging.setVState(logging.verbosity, filter, true) + return nil +} + +// isLiteral reports whether the pattern is a literal string, that is, has no metacharacters +// that require filepath.Match to be called to match the pattern. +func isLiteral(pattern string) bool { + return !strings.ContainsAny(pattern, `\*?[]`) +} + +// traceLocation represents the setting of the -log_backtrace_at flag. +type traceLocation struct { + file string + line int +} + +// isSet reports whether the trace location has been specified. +// logging.mu is held. +func (t *traceLocation) isSet() bool { + return t.line > 0 +} + +// match reports whether the specified file and line matches the trace location. +// The argument file name is the full path, not the basename specified in the flag. +// logging.mu is held. +func (t *traceLocation) match(file string, line int) bool { + if t.line != line { + return false + } + if i := strings.LastIndex(file, "/"); i >= 0 { + file = file[i+1:] + } + return t.file == file +} + +func (t *traceLocation) String() string { + // Lock because the type is not atomic. TODO: clean this up. + logging.mu.Lock() + defer logging.mu.Unlock() + return fmt.Sprintf("%s:%d", t.file, t.line) +} + +// Get is part of the (Go 1.2) flag.Getter interface. It always returns nil for this flag type since the +// struct is not exported +func (t *traceLocation) Get() interface{} { + return nil +} + +var errTraceSyntax = errors.New("syntax error: expect file.go:234") + +// Syntax: -log_backtrace_at=gopherflakes.go:234 +// Note that unlike vmodule the file extension is included here. +func (t *traceLocation) Set(value string) error { + if value == "" { + // Unset. + t.line = 0 + t.file = "" + } + fields := strings.Split(value, ":") + if len(fields) != 2 { + return errTraceSyntax + } + file, line := fields[0], fields[1] + if !strings.Contains(file, ".") { + return errTraceSyntax + } + v, err := strconv.Atoi(line) + if err != nil { + return errTraceSyntax + } + if v <= 0 { + return errors.New("negative or zero value for level") + } + logging.mu.Lock() + defer logging.mu.Unlock() + t.line = v + t.file = file + return nil +} + +// flushSyncWriter is the interface satisfied by logging destinations. +type flushSyncWriter interface { + Flush() error + Sync() error + io.Writer +} + +func init() { + flag.BoolVar(&logging.toStderr, "logtostderr", false, "log to standard error instead of files") + flag.BoolVar(&logging.alsoToStderr, "alsologtostderr", false, "log to standard error as well as files") + flag.Var(&logging.verbosity, "v", "log level for V logs") + flag.Var(&logging.stderrThreshold, "stderrthreshold", "logs at or above this threshold go to stderr") + flag.Var(&logging.vmodule, "vmodule", "comma-separated list of pattern=N settings for file-filtered logging") + flag.Var(&logging.traceLocation, "log_backtrace_at", "when logging hits line file:N, emit a stack trace") + + // Default stderrThreshold is ERROR. + logging.stderrThreshold = errorLog + + logging.setVState(0, nil, false) + go logging.flushDaemon() +} + +// Flush flushes all pending log I/O. +func Flush() { + logging.lockAndFlushAll() +} + +// loggingT collects all the global state of the logging setup. +type loggingT struct { + // Boolean flags. Not handled atomically because the flag.Value interface + // does not let us avoid the =true, and that shorthand is necessary for + // compatibility. TODO: does this matter enough to fix? Seems unlikely. + toStderr bool // The -logtostderr flag. + alsoToStderr bool // The -alsologtostderr flag. + + // Level flag. Handled atomically. + stderrThreshold severity // The -stderrthreshold flag. + + // freeList is a list of byte buffers, maintained under freeListMu. + freeList *buffer + // freeListMu maintains the free list. It is separate from the main mutex + // so buffers can be grabbed and printed to without holding the main lock, + // for better parallelization. + freeListMu sync.Mutex + + // mu protects the remaining elements of this structure and is + // used to synchronize logging. + mu sync.Mutex + // file holds writer for each of the log types. + file [numSeverity]flushSyncWriter + // pcs is used in V to avoid an allocation when computing the caller's PC. + pcs [1]uintptr + // vmap is a cache of the V Level for each V() call site, identified by PC. + // It is wiped whenever the vmodule flag changes state. + vmap map[uintptr]Level + // filterLength stores the length of the vmodule filter chain. If greater + // than zero, it means vmodule is enabled. It may be read safely + // using sync.LoadInt32, but is only modified under mu. + filterLength int32 + // traceLocation is the state of the -log_backtrace_at flag. + traceLocation traceLocation + // These flags are modified only under lock, although verbosity may be fetched + // safely using atomic.LoadInt32. + vmodule moduleSpec // The state of the -vmodule flag. + verbosity Level // V logging level, the value of the -v flag/ +} + +// buffer holds a byte Buffer for reuse. The zero value is ready for use. +type buffer struct { + bytes.Buffer + tmp [64]byte // temporary byte array for creating headers. + next *buffer +} + +var logging loggingT + +// setVState sets a consistent state for V logging. +// l.mu is held. +func (l *loggingT) setVState(verbosity Level, filter []modulePat, setFilter bool) { + // Turn verbosity off so V will not fire while we are in transition. + logging.verbosity.set(0) + // Ditto for filter length. + atomic.StoreInt32(&logging.filterLength, 0) + + // Set the new filters and wipe the pc->Level map if the filter has changed. + if setFilter { + logging.vmodule.filter = filter + logging.vmap = make(map[uintptr]Level) + } + + // Things are consistent now, so enable filtering and verbosity. + // They are enabled in order opposite to that in V. + atomic.StoreInt32(&logging.filterLength, int32(len(filter))) + logging.verbosity.set(verbosity) +} + +// getBuffer returns a new, ready-to-use buffer. +func (l *loggingT) getBuffer() *buffer { + l.freeListMu.Lock() + b := l.freeList + if b != nil { + l.freeList = b.next + } + l.freeListMu.Unlock() + if b == nil { + b = new(buffer) + } else { + b.next = nil + b.Reset() + } + return b +} + +// putBuffer returns a buffer to the free list. +func (l *loggingT) putBuffer(b *buffer) { + if b.Len() >= 256 { + // Let big buffers die a natural death. + return + } + l.freeListMu.Lock() + b.next = l.freeList + l.freeList = b + l.freeListMu.Unlock() +} + +var timeNow = time.Now // Stubbed out for testing. + +/* +header formats a log header as defined by the C++ implementation. +It returns a buffer containing the formatted header and the user's file and line number. +The depth specifies how many stack frames above lives the source line to be identified in the log message. + +Log lines have this form: + Lmmdd hh:mm:ss.uuuuuu threadid file:line] msg... +where the fields are defined as follows: + L A single character, representing the log level (eg 'I' for INFO) + mm The month (zero padded; ie May is '05') + dd The day (zero padded) + hh:mm:ss.uuuuuu Time in hours, minutes and fractional seconds + threadid The space-padded thread ID as returned by GetTID() + file The file name + line The line number + msg The user-supplied message +*/ +func (l *loggingT) header(s severity, depth int) (*buffer, string, int) { + _, file, line, ok := runtime.Caller(3 + depth) + if !ok { + file = "???" + line = 1 + } else { + slash := strings.LastIndex(file, "/") + if slash >= 0 { + file = file[slash+1:] + } + } + return l.formatHeader(s, file, line), file, line +} + +// formatHeader formats a log header using the provided file name and line number. +func (l *loggingT) formatHeader(s severity, file string, line int) *buffer { + now := timeNow() + if line < 0 { + line = 0 // not a real line number, but acceptable to someDigits + } + if s > fatalLog { + s = infoLog // for safety. + } + buf := l.getBuffer() + + // Avoid Fprintf, for speed. The format is so simple that we can do it quickly by hand. + // It's worth about 3X. Fprintf is hard. + _, month, day := now.Date() + hour, minute, second := now.Clock() + // Lmmdd hh:mm:ss.uuuuuu threadid file:line] + buf.tmp[0] = severityChar[s] + buf.twoDigits(1, int(month)) + buf.twoDigits(3, day) + buf.tmp[5] = ' ' + buf.twoDigits(6, hour) + buf.tmp[8] = ':' + buf.twoDigits(9, minute) + buf.tmp[11] = ':' + buf.twoDigits(12, second) + buf.tmp[14] = '.' + buf.nDigits(6, 15, now.Nanosecond()/1000, '0') + buf.tmp[21] = ' ' + buf.nDigits(7, 22, pid, ' ') // TODO: should be TID + buf.tmp[29] = ' ' + buf.Write(buf.tmp[:30]) + buf.WriteString(file) + buf.tmp[0] = ':' + n := buf.someDigits(1, line) + buf.tmp[n+1] = ']' + buf.tmp[n+2] = ' ' + buf.Write(buf.tmp[:n+3]) + return buf +} + +// Some custom tiny helper functions to print the log header efficiently. + +const digits = "0123456789" + +// twoDigits formats a zero-prefixed two-digit integer at buf.tmp[i]. +func (buf *buffer) twoDigits(i, d int) { + buf.tmp[i+1] = digits[d%10] + d /= 10 + buf.tmp[i] = digits[d%10] +} + +// nDigits formats an n-digit integer at buf.tmp[i], +// padding with pad on the left. +// It assumes d >= 0. +func (buf *buffer) nDigits(n, i, d int, pad byte) { + j := n - 1 + for ; j >= 0 && d > 0; j-- { + buf.tmp[i+j] = digits[d%10] + d /= 10 + } + for ; j >= 0; j-- { + buf.tmp[i+j] = pad + } +} + +// someDigits formats a zero-prefixed variable-width integer at buf.tmp[i]. +func (buf *buffer) someDigits(i, d int) int { + // Print into the top, then copy down. We know there's space for at least + // a 10-digit number. + j := len(buf.tmp) + for { + j-- + buf.tmp[j] = digits[d%10] + d /= 10 + if d == 0 { + break + } + } + return copy(buf.tmp[i:], buf.tmp[j:]) +} + +func (l *loggingT) println(s severity, args ...interface{}) { + buf, file, line := l.header(s, 0) + fmt.Fprintln(buf, args...) + l.output(s, buf, file, line, false) +} + +func (l *loggingT) print(s severity, args ...interface{}) { + l.printDepth(s, 1, args...) +} + +func (l *loggingT) printDepth(s severity, depth int, args ...interface{}) { + buf, file, line := l.header(s, depth) + fmt.Fprint(buf, args...) + if buf.Bytes()[buf.Len()-1] != '\n' { + buf.WriteByte('\n') + } + l.output(s, buf, file, line, false) +} + +func (l *loggingT) printf(s severity, format string, args ...interface{}) { + buf, file, line := l.header(s, 0) + fmt.Fprintf(buf, format, args...) + if buf.Bytes()[buf.Len()-1] != '\n' { + buf.WriteByte('\n') + } + l.output(s, buf, file, line, false) +} + +// printWithFileLine behaves like print but uses the provided file and line number. If +// alsoLogToStderr is true, the log message always appears on standard error; it +// will also appear in the log file unless --logtostderr is set. +func (l *loggingT) printWithFileLine(s severity, file string, line int, alsoToStderr bool, args ...interface{}) { + buf := l.formatHeader(s, file, line) + fmt.Fprint(buf, args...) + if buf.Bytes()[buf.Len()-1] != '\n' { + buf.WriteByte('\n') + } + l.output(s, buf, file, line, alsoToStderr) +} + +// output writes the data to the log files and releases the buffer. +func (l *loggingT) output(s severity, buf *buffer, file string, line int, alsoToStderr bool) { + l.mu.Lock() + if l.traceLocation.isSet() { + if l.traceLocation.match(file, line) { + buf.Write(stacks(false)) + } + } + data := buf.Bytes() + if !flag.Parsed() { + os.Stderr.Write([]byte("ERROR: logging before flag.Parse: ")) + os.Stderr.Write(data) + } else if l.toStderr { + os.Stderr.Write(data) + } else { + if alsoToStderr || l.alsoToStderr || s >= l.stderrThreshold.get() { + os.Stderr.Write(data) + } + if l.file[s] == nil { + if err := l.createFiles(s); err != nil { + os.Stderr.Write(data) // Make sure the message appears somewhere. + l.exit(err) + } + } + switch s { + case fatalLog: + l.file[fatalLog].Write(data) + fallthrough + case errorLog: + l.file[errorLog].Write(data) + fallthrough + case warningLog: + l.file[warningLog].Write(data) + fallthrough + case infoLog: + l.file[infoLog].Write(data) + } + } + if s == fatalLog { + // If we got here via Exit rather than Fatal, print no stacks. + if atomic.LoadUint32(&fatalNoStacks) > 0 { + l.mu.Unlock() + timeoutFlush(10 * time.Second) + os.Exit(1) + } + // Dump all goroutine stacks before exiting. + // First, make sure we see the trace for the current goroutine on standard error. + // If -logtostderr has been specified, the loop below will do that anyway + // as the first stack in the full dump. + if !l.toStderr { + os.Stderr.Write(stacks(false)) + } + // Write the stack trace for all goroutines to the files. + trace := stacks(true) + logExitFunc = func(error) {} // If we get a write error, we'll still exit below. + for log := fatalLog; log >= infoLog; log-- { + if f := l.file[log]; f != nil { // Can be nil if -logtostderr is set. + f.Write(trace) + } + } + l.mu.Unlock() + timeoutFlush(10 * time.Second) + os.Exit(255) // C++ uses -1, which is silly because it's anded with 255 anyway. + } + l.putBuffer(buf) + l.mu.Unlock() + if stats := severityStats[s]; stats != nil { + atomic.AddInt64(&stats.lines, 1) + atomic.AddInt64(&stats.bytes, int64(len(data))) + } +} + +// timeoutFlush calls Flush and returns when it completes or after timeout +// elapses, whichever happens first. This is needed because the hooks invoked +// by Flush may deadlock when glog.Fatal is called from a hook that holds +// a lock. +func timeoutFlush(timeout time.Duration) { + done := make(chan bool, 1) + go func() { + Flush() // calls logging.lockAndFlushAll() + done <- true + }() + select { + case <-done: + case <-time.After(timeout): + fmt.Fprintln(os.Stderr, "glog: Flush took longer than", timeout) + } +} + +// stacks is a wrapper for runtime.Stack that attempts to recover the data for all goroutines. +func stacks(all bool) []byte { + // We don't know how big the traces are, so grow a few times if they don't fit. Start large, though. + n := 10000 + if all { + n = 100000 + } + var trace []byte + for i := 0; i < 5; i++ { + trace = make([]byte, n) + nbytes := runtime.Stack(trace, all) + if nbytes < len(trace) { + return trace[:nbytes] + } + n *= 2 + } + return trace +} + +// logExitFunc provides a simple mechanism to override the default behavior +// of exiting on error. Used in testing and to guarantee we reach a required exit +// for fatal logs. Instead, exit could be a function rather than a method but that +// would make its use clumsier. +var logExitFunc func(error) + +// exit is called if there is trouble creating or writing log files. +// It flushes the logs and exits the program; there's no point in hanging around. +// l.mu is held. +func (l *loggingT) exit(err error) { + fmt.Fprintf(os.Stderr, "log: exiting because of error: %s\n", err) + // If logExitFunc is set, we do that instead of exiting. + if logExitFunc != nil { + logExitFunc(err) + return + } + l.flushAll() + os.Exit(2) +} + +// syncBuffer joins a bufio.Writer to its underlying file, providing access to the +// file's Sync method and providing a wrapper for the Write method that provides log +// file rotation. There are conflicting methods, so the file cannot be embedded. +// l.mu is held for all its methods. +type syncBuffer struct { + logger *loggingT + *bufio.Writer + file *os.File + sev severity + nbytes uint64 // The number of bytes written to this file +} + +func (sb *syncBuffer) Sync() error { + return sb.file.Sync() +} + +func (sb *syncBuffer) Write(p []byte) (n int, err error) { + if sb.nbytes+uint64(len(p)) >= MaxSize { + if err := sb.rotateFile(time.Now()); err != nil { + sb.logger.exit(err) + } + } + n, err = sb.Writer.Write(p) + sb.nbytes += uint64(n) + if err != nil { + sb.logger.exit(err) + } + return +} + +// rotateFile closes the syncBuffer's file and starts a new one. +func (sb *syncBuffer) rotateFile(now time.Time) error { + if sb.file != nil { + sb.Flush() + sb.file.Close() + } + var err error + sb.file, _, err = create(severityName[sb.sev], now) + sb.nbytes = 0 + if err != nil { + return err + } + + sb.Writer = bufio.NewWriterSize(sb.file, bufferSize) + + // Write header. + var buf bytes.Buffer + fmt.Fprintf(&buf, "Log file created at: %s\n", now.Format("2006/01/02 15:04:05")) + fmt.Fprintf(&buf, "Running on machine: %s\n", host) + fmt.Fprintf(&buf, "Binary: Built with %s %s for %s/%s\n", runtime.Compiler, runtime.Version(), runtime.GOOS, runtime.GOARCH) + fmt.Fprintf(&buf, "Log line format: [IWEF]mmdd hh:mm:ss.uuuuuu threadid file:line] msg\n") + n, err := sb.file.Write(buf.Bytes()) + sb.nbytes += uint64(n) + return err +} + +// bufferSize sizes the buffer associated with each log file. It's large +// so that log records can accumulate without the logging thread blocking +// on disk I/O. The flushDaemon will block instead. +const bufferSize = 256 * 1024 + +// createFiles creates all the log files for severity from sev down to infoLog. +// l.mu is held. +func (l *loggingT) createFiles(sev severity) error { + now := time.Now() + // Files are created in decreasing severity order, so as soon as we find one + // has already been created, we can stop. + for s := sev; s >= infoLog && l.file[s] == nil; s-- { + sb := &syncBuffer{ + logger: l, + sev: s, + } + if err := sb.rotateFile(now); err != nil { + return err + } + l.file[s] = sb + } + return nil +} + +const flushInterval = 30 * time.Second + +// flushDaemon periodically flushes the log file buffers. +func (l *loggingT) flushDaemon() { + for _ = range time.NewTicker(flushInterval).C { + l.lockAndFlushAll() + } +} + +// lockAndFlushAll is like flushAll but locks l.mu first. +func (l *loggingT) lockAndFlushAll() { + l.mu.Lock() + l.flushAll() + l.mu.Unlock() +} + +// flushAll flushes all the logs and attempts to "sync" their data to disk. +// l.mu is held. +func (l *loggingT) flushAll() { + // Flush from fatal down, in case there's trouble flushing. + for s := fatalLog; s >= infoLog; s-- { + file := l.file[s] + if file != nil { + file.Flush() // ignore error + file.Sync() // ignore error + } + } +} + +// CopyStandardLogTo arranges for messages written to the Go "log" package's +// default logs to also appear in the Google logs for the named and lower +// severities. Subsequent changes to the standard log's default output location +// or format may break this behavior. +// +// Valid names are "INFO", "WARNING", "ERROR", and "FATAL". If the name is not +// recognized, CopyStandardLogTo panics. +func CopyStandardLogTo(name string) { + sev, ok := severityByName(name) + if !ok { + panic(fmt.Sprintf("log.CopyStandardLogTo(%q): unrecognized severity name", name)) + } + // Set a log format that captures the user's file and line: + // d.go:23: message + stdLog.SetFlags(stdLog.Lshortfile) + stdLog.SetOutput(logBridge(sev)) +} + +// logBridge provides the Write method that enables CopyStandardLogTo to connect +// Go's standard logs to the logs provided by this package. +type logBridge severity + +// Write parses the standard logging line and passes its components to the +// logger for severity(lb). +func (lb logBridge) Write(b []byte) (n int, err error) { + var ( + file = "???" + line = 1 + text string + ) + // Split "d.go:23: message" into "d.go", "23", and "message". + if parts := bytes.SplitN(b, []byte{':'}, 3); len(parts) != 3 || len(parts[0]) < 1 || len(parts[2]) < 1 { + text = fmt.Sprintf("bad log format: %s", b) + } else { + file = string(parts[0]) + text = string(parts[2][1:]) // skip leading space + line, err = strconv.Atoi(string(parts[1])) + if err != nil { + text = fmt.Sprintf("bad line number: %s", b) + line = 1 + } + } + // printWithFileLine with alsoToStderr=true, so standard log messages + // always appear on standard error. + logging.printWithFileLine(severity(lb), file, line, true, text) + return len(b), nil +} + +// setV computes and remembers the V level for a given PC +// when vmodule is enabled. +// File pattern matching takes the basename of the file, stripped +// of its .go suffix, and uses filepath.Match, which is a little more +// general than the *? matching used in C++. +// l.mu is held. +func (l *loggingT) setV(pc uintptr) Level { + fn := runtime.FuncForPC(pc) + file, _ := fn.FileLine(pc) + // The file is something like /a/b/c/d.go. We want just the d. + if strings.HasSuffix(file, ".go") { + file = file[:len(file)-3] + } + if slash := strings.LastIndex(file, "/"); slash >= 0 { + file = file[slash+1:] + } + for _, filter := range l.vmodule.filter { + if filter.match(file) { + l.vmap[pc] = filter.level + return filter.level + } + } + l.vmap[pc] = 0 + return 0 +} + +// Verbose is a boolean type that implements Infof (like Printf) etc. +// See the documentation of V for more information. +type Verbose bool + +// V reports whether verbosity at the call site is at least the requested level. +// The returned value is a boolean of type Verbose, which implements Info, Infoln +// and Infof. These methods will write to the Info log if called. +// Thus, one may write either +// if glog.V(2) { glog.Info("log this") } +// or +// glog.V(2).Info("log this") +// The second form is shorter but the first is cheaper if logging is off because it does +// not evaluate its arguments. +// +// Whether an individual call to V generates a log record depends on the setting of +// the -v and --vmodule flags; both are off by default. If the level in the call to +// V is at least the value of -v, or of -vmodule for the source file containing the +// call, the V call will log. +func V(level Level) Verbose { + // This function tries hard to be cheap unless there's work to do. + // The fast path is two atomic loads and compares. + + // Here is a cheap but safe test to see if V logging is enabled globally. + if logging.verbosity.get() >= level { + return Verbose(true) + } + + // It's off globally but it vmodule may still be set. + // Here is another cheap but safe test to see if vmodule is enabled. + if atomic.LoadInt32(&logging.filterLength) > 0 { + // Now we need a proper lock to use the logging structure. The pcs field + // is shared so we must lock before accessing it. This is fairly expensive, + // but if V logging is enabled we're slow anyway. + logging.mu.Lock() + defer logging.mu.Unlock() + if runtime.Callers(2, logging.pcs[:]) == 0 { + return Verbose(false) + } + v, ok := logging.vmap[logging.pcs[0]] + if !ok { + v = logging.setV(logging.pcs[0]) + } + return Verbose(v >= level) + } + return Verbose(false) +} + +// Info is equivalent to the global Info function, guarded by the value of v. +// See the documentation of V for usage. +func (v Verbose) Info(args ...interface{}) { + if v { + logging.print(infoLog, args...) + } +} + +// Infoln is equivalent to the global Infoln function, guarded by the value of v. +// See the documentation of V for usage. +func (v Verbose) Infoln(args ...interface{}) { + if v { + logging.println(infoLog, args...) + } +} + +// Infof is equivalent to the global Infof function, guarded by the value of v. +// See the documentation of V for usage. +func (v Verbose) Infof(format string, args ...interface{}) { + if v { + logging.printf(infoLog, format, args...) + } +} + +// Info logs to the INFO log. +// Arguments are handled in the manner of fmt.Print; a newline is appended if missing. +func Info(args ...interface{}) { + logging.print(infoLog, args...) +} + +// InfoDepth acts as Info but uses depth to determine which call frame to log. +// InfoDepth(0, "msg") is the same as Info("msg"). +func InfoDepth(depth int, args ...interface{}) { + logging.printDepth(infoLog, depth, args...) +} + +// Infoln logs to the INFO log. +// Arguments are handled in the manner of fmt.Println; a newline is appended if missing. +func Infoln(args ...interface{}) { + logging.println(infoLog, args...) +} + +// Infof logs to the INFO log. +// Arguments are handled in the manner of fmt.Printf; a newline is appended if missing. +func Infof(format string, args ...interface{}) { + logging.printf(infoLog, format, args...) +} + +// Warning logs to the WARNING and INFO logs. +// Arguments are handled in the manner of fmt.Print; a newline is appended if missing. +func Warning(args ...interface{}) { + logging.print(warningLog, args...) +} + +// WarningDepth acts as Warning but uses depth to determine which call frame to log. +// WarningDepth(0, "msg") is the same as Warning("msg"). +func WarningDepth(depth int, args ...interface{}) { + logging.printDepth(warningLog, depth, args...) +} + +// Warningln logs to the WARNING and INFO logs. +// Arguments are handled in the manner of fmt.Println; a newline is appended if missing. +func Warningln(args ...interface{}) { + logging.println(warningLog, args...) +} + +// Warningf logs to the WARNING and INFO logs. +// Arguments are handled in the manner of fmt.Printf; a newline is appended if missing. +func Warningf(format string, args ...interface{}) { + logging.printf(warningLog, format, args...) +} + +// Error logs to the ERROR, WARNING, and INFO logs. +// Arguments are handled in the manner of fmt.Print; a newline is appended if missing. +func Error(args ...interface{}) { + logging.print(errorLog, args...) +} + +// ErrorDepth acts as Error but uses depth to determine which call frame to log. +// ErrorDepth(0, "msg") is the same as Error("msg"). +func ErrorDepth(depth int, args ...interface{}) { + logging.printDepth(errorLog, depth, args...) +} + +// Errorln logs to the ERROR, WARNING, and INFO logs. +// Arguments are handled in the manner of fmt.Println; a newline is appended if missing. +func Errorln(args ...interface{}) { + logging.println(errorLog, args...) +} + +// Errorf logs to the ERROR, WARNING, and INFO logs. +// Arguments are handled in the manner of fmt.Printf; a newline is appended if missing. +func Errorf(format string, args ...interface{}) { + logging.printf(errorLog, format, args...) +} + +// Fatal logs to the FATAL, ERROR, WARNING, and INFO logs, +// including a stack trace of all running goroutines, then calls os.Exit(255). +// Arguments are handled in the manner of fmt.Print; a newline is appended if missing. +func Fatal(args ...interface{}) { + logging.print(fatalLog, args...) +} + +// FatalDepth acts as Fatal but uses depth to determine which call frame to log. +// FatalDepth(0, "msg") is the same as Fatal("msg"). +func FatalDepth(depth int, args ...interface{}) { + logging.printDepth(fatalLog, depth, args...) +} + +// Fatalln logs to the FATAL, ERROR, WARNING, and INFO logs, +// including a stack trace of all running goroutines, then calls os.Exit(255). +// Arguments are handled in the manner of fmt.Println; a newline is appended if missing. +func Fatalln(args ...interface{}) { + logging.println(fatalLog, args...) +} + +// Fatalf logs to the FATAL, ERROR, WARNING, and INFO logs, +// including a stack trace of all running goroutines, then calls os.Exit(255). +// Arguments are handled in the manner of fmt.Printf; a newline is appended if missing. +func Fatalf(format string, args ...interface{}) { + logging.printf(fatalLog, format, args...) +} + +// fatalNoStacks is non-zero if we are to exit without dumping goroutine stacks. +// It allows Exit and relatives to use the Fatal logs. +var fatalNoStacks uint32 + +// Exit logs to the FATAL, ERROR, WARNING, and INFO logs, then calls os.Exit(1). +// Arguments are handled in the manner of fmt.Print; a newline is appended if missing. +func Exit(args ...interface{}) { + atomic.StoreUint32(&fatalNoStacks, 1) + logging.print(fatalLog, args...) +} + +// ExitDepth acts as Exit but uses depth to determine which call frame to log. +// ExitDepth(0, "msg") is the same as Exit("msg"). +func ExitDepth(depth int, args ...interface{}) { + atomic.StoreUint32(&fatalNoStacks, 1) + logging.printDepth(fatalLog, depth, args...) +} + +// Exitln logs to the FATAL, ERROR, WARNING, and INFO logs, then calls os.Exit(1). +func Exitln(args ...interface{}) { + atomic.StoreUint32(&fatalNoStacks, 1) + logging.println(fatalLog, args...) +} + +// Exitf logs to the FATAL, ERROR, WARNING, and INFO logs, then calls os.Exit(1). +// Arguments are handled in the manner of fmt.Printf; a newline is appended if missing. +func Exitf(format string, args ...interface{}) { + atomic.StoreUint32(&fatalNoStacks, 1) + logging.printf(fatalLog, format, args...) +} diff --git a/cluster-autoscaler/vendor/github.com/golang/glog/glog_file.go b/cluster-autoscaler/vendor/github.com/golang/glog/glog_file.go new file mode 100644 index 000000000000..65075d281110 --- /dev/null +++ b/cluster-autoscaler/vendor/github.com/golang/glog/glog_file.go @@ -0,0 +1,124 @@ +// Go support for leveled logs, analogous to https://code.google.com/p/google-glog/ +// +// Copyright 2013 Google Inc. 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. +// 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. + +// File I/O for logs. + +package glog + +import ( + "errors" + "flag" + "fmt" + "os" + "os/user" + "path/filepath" + "strings" + "sync" + "time" +) + +// MaxSize is the maximum size of a log file in bytes. +var MaxSize uint64 = 1024 * 1024 * 1800 + +// logDirs lists the candidate directories for new log files. +var logDirs []string + +// If non-empty, overrides the choice of directory in which to write logs. +// See createLogDirs for the full list of possible destinations. +var logDir = flag.String("log_dir", "", "If non-empty, write log files in this directory") + +func createLogDirs() { + if *logDir != "" { + logDirs = append(logDirs, *logDir) + } + logDirs = append(logDirs, os.TempDir()) +} + +var ( + pid = os.Getpid() + program = filepath.Base(os.Args[0]) + host = "unknownhost" + userName = "unknownuser" +) + +func init() { + h, err := os.Hostname() + if err == nil { + host = shortHostname(h) + } + + current, err := user.Current() + if err == nil { + userName = current.Username + } + + // Sanitize userName since it may contain filepath separators on Windows. + userName = strings.Replace(userName, `\`, "_", -1) +} + +// shortHostname returns its argument, truncating at the first period. +// For instance, given "www.google.com" it returns "www". +func shortHostname(hostname string) string { + if i := strings.Index(hostname, "."); i >= 0 { + return hostname[:i] + } + return hostname +} + +// logName returns a new log file name containing tag, with start time t, and +// the name for the symlink for tag. +func logName(tag string, t time.Time) (name, link string) { + name = fmt.Sprintf("%s.%s.%s.log.%s.%04d%02d%02d-%02d%02d%02d.%d", + program, + host, + userName, + tag, + t.Year(), + t.Month(), + t.Day(), + t.Hour(), + t.Minute(), + t.Second(), + pid) + return name, program + "." + tag +} + +var onceLogDirs sync.Once + +// create creates a new log file and returns the file and its filename, which +// contains tag ("INFO", "FATAL", etc.) and t. If the file is created +// successfully, create also attempts to update the symlink for that tag, ignoring +// errors. +func create(tag string, t time.Time) (f *os.File, filename string, err error) { + onceLogDirs.Do(createLogDirs) + if len(logDirs) == 0 { + return nil, "", errors.New("log: no log dirs") + } + name, link := logName(tag, t) + var lastErr error + for _, dir := range logDirs { + fname := filepath.Join(dir, name) + f, err := os.Create(fname) + if err == nil { + symlink := filepath.Join(dir, link) + os.Remove(symlink) // ignore err + os.Symlink(name, symlink) // ignore err + return f, fname, nil + } + lastErr = err + } + return nil, "", fmt.Errorf("log: cannot create log: %v", lastErr) +} diff --git a/cluster-autoscaler/vendor/k8s.io/apimachinery/pkg/util/proxy/upgradeaware.go b/cluster-autoscaler/vendor/k8s.io/apimachinery/pkg/util/proxy/upgradeaware.go index 2cabb894c1af..3c8e09399f51 100644 --- a/cluster-autoscaler/vendor/k8s.io/apimachinery/pkg/util/proxy/upgradeaware.go +++ b/cluster-autoscaler/vendor/k8s.io/apimachinery/pkg/util/proxy/upgradeaware.go @@ -273,7 +273,7 @@ func (h *UpgradeAwareHandler) tryUpgrade(w http.ResponseWriter, req *http.Reques defer backendConn.Close() // determine the http response code from the backend by reading from rawResponse+backendConn - rawResponseCode, headerBytes, err := getResponseCode(io.MultiReader(bytes.NewReader(rawResponse), backendConn)) + backendHTTPResponse, headerBytes, err := getResponse(io.MultiReader(bytes.NewReader(rawResponse), backendConn)) if err != nil { klog.V(6).Infof("Proxy connection error: %v", err) h.Responder.Error(w, req, err) @@ -300,6 +300,22 @@ func (h *UpgradeAwareHandler) tryUpgrade(w http.ResponseWriter, req *http.Reques } defer requestHijackedConn.Close() + if backendHTTPResponse.StatusCode != http.StatusSwitchingProtocols { + // If the backend did not upgrade the request, echo the response from the backend to the client and return, closing the connection. + klog.V(6).Infof("Proxy upgrade error, status code %d", backendHTTPResponse.StatusCode) + // set read/write deadlines + deadline := time.Now().Add(10 * time.Second) + backendConn.SetReadDeadline(deadline) + requestHijackedConn.SetWriteDeadline(deadline) + // write the response to the client + err := backendHTTPResponse.Write(requestHijackedConn) + if err != nil && !strings.Contains(err.Error(), "use of closed network connection") { + klog.Errorf("Error proxying data from backend to client: %v", err) + } + // Indicate we handled the request + return true + } + // Forward raw response bytes back to client. if len(rawResponse) > 0 { klog.V(6).Infof("Writing %d bytes to hijacked connection", len(rawResponse)) @@ -308,17 +324,6 @@ func (h *UpgradeAwareHandler) tryUpgrade(w http.ResponseWriter, req *http.Reques } } - if rawResponseCode != http.StatusSwitchingProtocols { - // If the backend did not upgrade the request, finish echoing the response from the backend to the client and return, closing the connection. - klog.V(6).Infof("Proxy upgrade error, status code %d", rawResponseCode) - _, err := io.Copy(requestHijackedConn, backendConn) - if err != nil && !strings.Contains(err.Error(), "use of closed network connection") { - klog.Errorf("Error proxying data from backend to client: %v", err) - } - // Indicate we handled the request - return true - } - // Proxy the connection. This is bidirectional, so we need a goroutine // to copy in each direction. Once one side of the connection exits, we // exit the function which performs cleanup and in the process closes @@ -380,17 +385,17 @@ func (h *UpgradeAwareHandler) DialForUpgrade(req *http.Request) (net.Conn, error return dial(updatedReq, h.UpgradeTransport) } -// getResponseCode reads a http response from the given reader, returns the status code, +// getResponseCode reads a http response from the given reader, returns the response, // the bytes read from the reader, and any error encountered -func getResponseCode(r io.Reader) (int, []byte, error) { +func getResponse(r io.Reader) (*http.Response, []byte, error) { rawResponse := bytes.NewBuffer(make([]byte, 0, 256)) // Save the bytes read while reading the response headers into the rawResponse buffer resp, err := http.ReadResponse(bufio.NewReader(io.TeeReader(r, rawResponse)), nil) if err != nil { - return 0, nil, err + return nil, nil, err } - // return the http status code and the raw bytes consumed from the reader in the process - return resp.StatusCode, rawResponse.Bytes(), nil + // return the http response and the raw bytes consumed from the reader in the process + return resp, rawResponse.Bytes(), nil } // dial dials the backend at req.URL and writes req to it. diff --git a/cluster-autoscaler/vendor/k8s.io/apiserver/pkg/util/webhook/authentication.go b/cluster-autoscaler/vendor/k8s.io/apiserver/pkg/util/webhook/authentication.go index 1d1c0ad3bc9d..dd0f4e5e663c 100644 --- a/cluster-autoscaler/vendor/k8s.io/apiserver/pkg/util/webhook/authentication.go +++ b/cluster-autoscaler/vendor/k8s.io/apiserver/pkg/util/webhook/authentication.go @@ -177,6 +177,7 @@ func restConfigFromKubeconfig(configAuthInfo *clientcmdapi.AuthInfo) (*rest.Conf return nil, err } config.BearerToken = string(tokenBytes) + config.BearerTokenFile = configAuthInfo.TokenFile } if len(configAuthInfo.Impersonate) > 0 { config.Impersonate = rest.ImpersonationConfig{ diff --git a/cluster-autoscaler/vendor/k8s.io/client-go/rest/BUILD b/cluster-autoscaler/vendor/k8s.io/client-go/rest/BUILD index 70920303e4e4..9f00aac950e7 100644 --- a/cluster-autoscaler/vendor/k8s.io/client-go/rest/BUILD +++ b/cluster-autoscaler/vendor/k8s.io/client-go/rest/BUILD @@ -13,7 +13,6 @@ go_test( "config_test.go", "plugin_test.go", "request_test.go", - "token_source_test.go", "url_utils_test.go", "urlbackoff_test.go", ], @@ -41,7 +40,6 @@ go_test( "//staging/src/k8s.io/client-go/util/testing:go_default_library", "//vendor/github.com/google/gofuzz:go_default_library", "//vendor/github.com/stretchr/testify/assert:go_default_library", - "//vendor/golang.org/x/oauth2:go_default_library", "//vendor/k8s.io/klog:go_default_library", ], ) @@ -53,7 +51,6 @@ go_library( "config.go", "plugin.go", "request.go", - "token_source.go", "transport.go", "url_utils.go", "urlbackoff.go", @@ -80,7 +77,6 @@ go_library( "//staging/src/k8s.io/client-go/util/cert:go_default_library", "//staging/src/k8s.io/client-go/util/flowcontrol:go_default_library", "//vendor/golang.org/x/net/http2:go_default_library", - "//vendor/golang.org/x/oauth2:go_default_library", "//vendor/k8s.io/klog:go_default_library", ], ) diff --git a/cluster-autoscaler/vendor/k8s.io/client-go/rest/config.go b/cluster-autoscaler/vendor/k8s.io/client-go/rest/config.go index 438eb3bedac0..072e7392b191 100644 --- a/cluster-autoscaler/vendor/k8s.io/client-go/rest/config.go +++ b/cluster-autoscaler/vendor/k8s.io/client-go/rest/config.go @@ -70,6 +70,11 @@ type Config struct { // TODO: demonstrate an OAuth2 compatible client. BearerToken string + // Path to a file containing a BearerToken. + // If set, the contents are periodically read. + // The last successfully read value takes precedence over BearerToken. + BearerTokenFile string + // Impersonate is the configuration that RESTClient will use for impersonation. Impersonate ImpersonationConfig @@ -322,9 +327,8 @@ func InClusterConfig() (*Config, error) { return nil, ErrNotInCluster } - ts := NewCachedFileTokenSource(tokenFile) - - if _, err := ts.Token(); err != nil { + token, err := ioutil.ReadFile(tokenFile) + if err != nil { return nil, err } @@ -340,7 +344,8 @@ func InClusterConfig() (*Config, error) { // TODO: switch to using cluster DNS. Host: "https://" + net.JoinHostPort(host, port), TLSClientConfig: tlsClientConfig, - WrapTransport: TokenSourceWrapTransport(ts), + BearerToken: string(token), + BearerTokenFile: tokenFile, }, nil } @@ -430,12 +435,13 @@ func AnonymousClientConfig(config *Config) *Config { // CopyConfig returns a copy of the given config func CopyConfig(config *Config) *Config { return &Config{ - Host: config.Host, - APIPath: config.APIPath, - ContentConfig: config.ContentConfig, - Username: config.Username, - Password: config.Password, - BearerToken: config.BearerToken, + Host: config.Host, + APIPath: config.APIPath, + ContentConfig: config.ContentConfig, + Username: config.Username, + Password: config.Password, + BearerToken: config.BearerToken, + BearerTokenFile: config.BearerTokenFile, Impersonate: ImpersonationConfig{ Groups: config.Impersonate.Groups, Extra: config.Impersonate.Extra, diff --git a/cluster-autoscaler/vendor/k8s.io/client-go/tools/clientcmd/client_config.go b/cluster-autoscaler/vendor/k8s.io/client-go/tools/clientcmd/client_config.go index dea229c91825..a7b8c1c6e42b 100644 --- a/cluster-autoscaler/vendor/k8s.io/client-go/tools/clientcmd/client_config.go +++ b/cluster-autoscaler/vendor/k8s.io/client-go/tools/clientcmd/client_config.go @@ -229,11 +229,12 @@ func (config *DirectClientConfig) getUserIdentificationPartialConfig(configAuthI if len(configAuthInfo.Token) > 0 { mergedConfig.BearerToken = configAuthInfo.Token } else if len(configAuthInfo.TokenFile) > 0 { - ts := restclient.NewCachedFileTokenSource(configAuthInfo.TokenFile) - if _, err := ts.Token(); err != nil { + tokenBytes, err := ioutil.ReadFile(configAuthInfo.TokenFile) + if err != nil { return nil, err } - mergedConfig.WrapTransport = restclient.TokenSourceWrapTransport(ts) + mergedConfig.BearerToken = string(tokenBytes) + mergedConfig.BearerTokenFile = configAuthInfo.TokenFile } if len(configAuthInfo.Impersonate) > 0 { mergedConfig.Impersonate = restclient.ImpersonationConfig{ diff --git a/cluster-autoscaler/vendor/k8s.io/client-go/transport/BUILD b/cluster-autoscaler/vendor/k8s.io/client-go/transport/BUILD index dc1800681d3f..643750e25638 100644 --- a/cluster-autoscaler/vendor/k8s.io/client-go/transport/BUILD +++ b/cluster-autoscaler/vendor/k8s.io/client-go/transport/BUILD @@ -11,9 +11,11 @@ go_test( srcs = [ "cache_test.go", "round_trippers_test.go", + "token_source_test.go", "transport_test.go", ], embed = [":go_default_library"], + deps = ["//vendor/golang.org/x/oauth2:go_default_library"], ) go_library( @@ -22,12 +24,14 @@ go_library( "cache.go", "config.go", "round_trippers.go", + "token_source.go", "transport.go", ], importmap = "k8s.io/kubernetes/vendor/k8s.io/client-go/transport", importpath = "k8s.io/client-go/transport", deps = [ "//staging/src/k8s.io/apimachinery/pkg/util/net:go_default_library", + "//vendor/golang.org/x/oauth2:go_default_library", "//vendor/k8s.io/klog:go_default_library", ], ) diff --git a/cluster-autoscaler/vendor/k8s.io/client-go/transport/config.go b/cluster-autoscaler/vendor/k8s.io/client-go/transport/config.go index 4081c23e7ff0..acb126d8b09c 100644 --- a/cluster-autoscaler/vendor/k8s.io/client-go/transport/config.go +++ b/cluster-autoscaler/vendor/k8s.io/client-go/transport/config.go @@ -39,6 +39,11 @@ type Config struct { // Bearer token for authentication BearerToken string + // Path to a file containing a BearerToken. + // If set, the contents are periodically read. + // The last successfully read value takes precedence over BearerToken. + BearerTokenFile string + // Impersonate is the config that this Config will impersonate using Impersonate ImpersonationConfig @@ -80,7 +85,7 @@ func (c *Config) HasBasicAuth() bool { // HasTokenAuth returns whether the configuration has token authentication or not. func (c *Config) HasTokenAuth() bool { - return len(c.BearerToken) != 0 + return len(c.BearerToken) != 0 || len(c.BearerTokenFile) != 0 } // HasCertAuth returns whether the configuration has certificate authentication or not. diff --git a/cluster-autoscaler/vendor/k8s.io/client-go/transport/round_trippers.go b/cluster-autoscaler/vendor/k8s.io/client-go/transport/round_trippers.go index da417cf96ea0..117a9c8c4de4 100644 --- a/cluster-autoscaler/vendor/k8s.io/client-go/transport/round_trippers.go +++ b/cluster-autoscaler/vendor/k8s.io/client-go/transport/round_trippers.go @@ -22,6 +22,7 @@ import ( "strings" "time" + "golang.org/x/oauth2" "k8s.io/klog" utilnet "k8s.io/apimachinery/pkg/util/net" @@ -44,7 +45,11 @@ func HTTPWrappersForConfig(config *Config, rt http.RoundTripper) (http.RoundTrip case config.HasBasicAuth() && config.HasTokenAuth(): return nil, fmt.Errorf("username/password or bearer token may be set, but not both") case config.HasTokenAuth(): - rt = NewBearerAuthRoundTripper(config.BearerToken, rt) + var err error + rt, err = NewBearerAuthWithRefreshRoundTripper(config.BearerToken, config.BearerTokenFile, rt) + if err != nil { + return nil, err + } case config.HasBasicAuth(): rt = NewBasicAuthRoundTripper(config.Username, config.Password, rt) } @@ -265,13 +270,35 @@ func (rt *impersonatingRoundTripper) WrappedRoundTripper() http.RoundTripper { r type bearerAuthRoundTripper struct { bearer string + source oauth2.TokenSource rt http.RoundTripper } // NewBearerAuthRoundTripper adds the provided bearer token to a request // unless the authorization header has already been set. func NewBearerAuthRoundTripper(bearer string, rt http.RoundTripper) http.RoundTripper { - return &bearerAuthRoundTripper{bearer, rt} + return &bearerAuthRoundTripper{bearer, nil, rt} +} + +// NewBearerAuthRoundTripper adds the provided bearer token to a request +// unless the authorization header has already been set. +// If tokenFile is non-empty, it is periodically read, +// and the last successfully read content is used as the bearer token. +// If tokenFile is non-empty and bearer is empty, the tokenFile is read +// immediately to populate the initial bearer token. +func NewBearerAuthWithRefreshRoundTripper(bearer string, tokenFile string, rt http.RoundTripper) (http.RoundTripper, error) { + if len(tokenFile) == 0 { + return &bearerAuthRoundTripper{bearer, nil, rt}, nil + } + source := NewCachedFileTokenSource(tokenFile) + if len(bearer) == 0 { + token, err := source.Token() + if err != nil { + return nil, err + } + bearer = token.AccessToken + } + return &bearerAuthRoundTripper{bearer, source, rt}, nil } func (rt *bearerAuthRoundTripper) RoundTrip(req *http.Request) (*http.Response, error) { @@ -280,7 +307,13 @@ func (rt *bearerAuthRoundTripper) RoundTrip(req *http.Request) (*http.Response, } req = utilnet.CloneRequest(req) - req.Header.Set("Authorization", fmt.Sprintf("Bearer %s", rt.bearer)) + token := rt.bearer + if rt.source != nil { + if refreshedToken, err := rt.source.Token(); err == nil { + token = refreshedToken.AccessToken + } + } + req.Header.Set("Authorization", fmt.Sprintf("Bearer %s", token)) return rt.rt.RoundTrip(req) } diff --git a/cluster-autoscaler/vendor/k8s.io/client-go/rest/token_source.go b/cluster-autoscaler/vendor/k8s.io/client-go/transport/token_source.go similarity index 87% rename from cluster-autoscaler/vendor/k8s.io/client-go/rest/token_source.go rename to cluster-autoscaler/vendor/k8s.io/client-go/transport/token_source.go index c251b5eb0bb6..8595df271694 100644 --- a/cluster-autoscaler/vendor/k8s.io/client-go/rest/token_source.go +++ b/cluster-autoscaler/vendor/k8s.io/client-go/transport/token_source.go @@ -14,7 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. */ -package rest +package transport import ( "fmt" @@ -47,14 +47,14 @@ func TokenSourceWrapTransport(ts oauth2.TokenSource) func(http.RoundTripper) htt func NewCachedFileTokenSource(path string) oauth2.TokenSource { return &cachingTokenSource{ now: time.Now, - leeway: 1 * time.Minute, + leeway: 10 * time.Second, base: &fileTokenSource{ path: path, - // This period was picked because it is half of the minimum validity - // duration for a token provisioned by they TokenRequest API. This is - // unsophisticated and should induce rotation at a frequency that should - // work with the token volume source. - period: 5 * time.Minute, + // This period was picked because it is half of the duration between when the kubelet + // refreshes a projected service account token and when the original token expires. + // Default token lifetime is 10 minutes, and the kubelet starts refreshing at 80% of lifetime. + // This should induce re-reading at a frequency that works with the token volume source. + period: time.Minute, }, } } diff --git a/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/apis/autoscaling/v2beta1/BUILD b/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/apis/autoscaling/v2beta1/BUILD index 47d21ddb94ee..5fbc372b4583 100644 --- a/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/apis/autoscaling/v2beta1/BUILD +++ b/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/apis/autoscaling/v2beta1/BUILD @@ -26,7 +26,10 @@ go_library( go_test( name = "go_default_test", - srcs = ["defaults_test.go"], + srcs = [ + "conversion_test.go", + "defaults_test.go", + ], embed = [":go_default_library"], deps = [ "//pkg/api/legacyscheme:go_default_library", @@ -37,6 +40,7 @@ go_test( "//staging/src/k8s.io/api/core/v1:go_default_library", "//staging/src/k8s.io/apimachinery/pkg/api/equality:go_default_library", "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", + "//vendor/github.com/stretchr/testify/assert:go_default_library", "//vendor/k8s.io/utils/pointer:go_default_library", ], ) diff --git a/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/apis/autoscaling/v2beta1/conversion.go b/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/apis/autoscaling/v2beta1/conversion.go index eebc10430534..142cf726493f 100644 --- a/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/apis/autoscaling/v2beta1/conversion.go +++ b/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/apis/autoscaling/v2beta1/conversion.go @@ -185,8 +185,10 @@ func Convert_v2beta1_ObjectMetricSource_To_autoscaling_ObjectMetricSource(in *au } func Convert_autoscaling_PodsMetricSource_To_v2beta1_PodsMetricSource(in *autoscaling.PodsMetricSource, out *autoscalingv2beta1.PodsMetricSource, s conversion.Scope) error { - targetAverageValue := *in.Target.AverageValue - out.TargetAverageValue = targetAverageValue + if in.Target.AverageValue != nil { + targetAverageValue := *in.Target.AverageValue + out.TargetAverageValue = targetAverageValue + } out.MetricName = in.Metric.Name out.Selector = in.Metric.Selector @@ -247,8 +249,10 @@ func Convert_autoscaling_ObjectMetricStatus_To_v2beta1_ObjectMetricStatus(in *au } out.MetricName = in.Metric.Name out.Selector = in.Metric.Selector - currentAverageValue := *in.Current.AverageValue - out.AverageValue = ¤tAverageValue + if in.Current.AverageValue != nil { + currentAverageValue := *in.Current.AverageValue + out.AverageValue = ¤tAverageValue + } return nil } diff --git a/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/cloudprovider/providers/azure/azure_controller_standard.go b/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/cloudprovider/providers/azure/azure_controller_standard.go index b21964b215ea..f600209e284a 100644 --- a/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/cloudprovider/providers/azure/azure_controller_standard.go +++ b/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/cloudprovider/providers/azure/azure_controller_standard.go @@ -68,6 +68,7 @@ func (as *availabilitySet) AttachDisk(isManagedDisk bool, diskName, diskURI stri newVM := compute.VirtualMachine{ Location: vm.Location, VirtualMachineProperties: &compute.VirtualMachineProperties{ + HardwareProfile: vm.HardwareProfile, StorageProfile: &compute.StorageProfile{ DataDisks: &disks, }, @@ -77,6 +78,9 @@ func (as *availabilitySet) AttachDisk(isManagedDisk bool, diskName, diskURI stri ctx, cancel := getContextWithCancel() defer cancel() + // Invalidate the cache right after updating + defer as.cloud.vmCache.Delete(vmName) + _, err = as.VirtualMachinesClient.CreateOrUpdate(ctx, nodeResourceGroup, vmName, newVM) if err != nil { klog.Errorf("azureDisk - attach disk(%s) failed, err: %v", diskName, err) @@ -88,8 +92,6 @@ func (as *availabilitySet) AttachDisk(isManagedDisk bool, diskName, diskURI stri } } else { klog.V(2).Infof("azureDisk - attach disk(%s) succeeded", diskName) - // Invalidate the cache right after updating - as.cloud.vmCache.Delete(vmName) } return err } @@ -131,6 +133,7 @@ func (as *availabilitySet) DetachDiskByName(diskName, diskURI string, nodeName t newVM := compute.VirtualMachine{ Location: vm.Location, VirtualMachineProperties: &compute.VirtualMachineProperties{ + HardwareProfile: vm.HardwareProfile, StorageProfile: &compute.StorageProfile{ DataDisks: &disks, }, @@ -139,13 +142,15 @@ func (as *availabilitySet) DetachDiskByName(diskName, diskURI string, nodeName t klog.V(2).Infof("azureDisk - update(%s): vm(%s) - detach disk(%s)", nodeResourceGroup, vmName, diskName) ctx, cancel := getContextWithCancel() defer cancel() + + // Invalidate the cache right after updating + defer as.cloud.vmCache.Delete(vmName) + _, err = as.VirtualMachinesClient.CreateOrUpdate(ctx, nodeResourceGroup, vmName, newVM) if err != nil { klog.Errorf("azureDisk - detach disk(%s) failed, err: %v", diskName, err) } else { klog.V(2).Infof("azureDisk - detach disk(%s) succeeded", diskName) - // Invalidate the cache right after updating - as.cloud.vmCache.Delete(vmName) } return err } diff --git a/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/cloudprovider/providers/azure/azure_controller_vmss.go b/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/cloudprovider/providers/azure/azure_controller_vmss.go index b11705fdfc06..80a27bf03854 100644 --- a/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/cloudprovider/providers/azure/azure_controller_vmss.go +++ b/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/cloudprovider/providers/azure/azure_controller_vmss.go @@ -67,13 +67,27 @@ func (ss *scaleSet) AttachDisk(isManagedDisk bool, diskName, diskURI string, nod CreateOption: "attach", }) } - vm.StorageProfile.DataDisks = &disks + newVM := compute.VirtualMachineScaleSetVM{ + Sku: vm.Sku, + Location: vm.Location, + VirtualMachineScaleSetVMProperties: &compute.VirtualMachineScaleSetVMProperties{ + HardwareProfile: vm.HardwareProfile, + StorageProfile: &compute.StorageProfile{ + OsDisk: vm.StorageProfile.OsDisk, + DataDisks: &disks, + }, + }, + } ctx, cancel := getContextWithCancel() defer cancel() - klog.V(2).Infof("azureDisk - update(%s): vm(%s) - attach disk(%s)", nodeResourceGroup, nodeName, diskName) - _, err = ss.VirtualMachineScaleSetVMsClient.Update(ctx, nodeResourceGroup, ssName, instanceID, vm) + // Invalidate the cache right after updating + key := buildVmssCacheKey(nodeResourceGroup, ss.makeVmssVMName(ssName, instanceID)) + defer ss.vmssVMCache.Delete(key) + + klog.V(2).Infof("azureDisk - update(%s): vm(%s) - attach disk(%s)", nodeResourceGroup, nodeName, diskName) + _, err = ss.VirtualMachineScaleSetVMsClient.Update(ctx, nodeResourceGroup, ssName, instanceID, newVM) if err != nil { detail := err.Error() if strings.Contains(detail, errLeaseFailed) || strings.Contains(detail, errDiskBlobNotFound) { @@ -83,9 +97,6 @@ func (ss *scaleSet) AttachDisk(isManagedDisk bool, diskName, diskURI string, nod } } else { klog.V(2).Infof("azureDisk - attach disk(%s) succeeded", diskName) - // Invalidate the cache right after updating - key := buildVmssCacheKey(nodeResourceGroup, ss.makeVmssVMName(ssName, instanceID)) - ss.vmssVMCache.Delete(key) } return err } @@ -125,18 +136,31 @@ func (ss *scaleSet) DetachDiskByName(diskName, diskURI string, nodeName types.No return fmt.Errorf("detach azure disk failure, disk %s not found, diskURI: %s", diskName, diskURI) } - vm.StorageProfile.DataDisks = &disks + newVM := compute.VirtualMachineScaleSetVM{ + Sku: vm.Sku, + Location: vm.Location, + VirtualMachineScaleSetVMProperties: &compute.VirtualMachineScaleSetVMProperties{ + HardwareProfile: vm.HardwareProfile, + StorageProfile: &compute.StorageProfile{ + OsDisk: vm.StorageProfile.OsDisk, + DataDisks: &disks, + }, + }, + } + ctx, cancel := getContextWithCancel() defer cancel() + + // Invalidate the cache right after updating + key := buildVmssCacheKey(nodeResourceGroup, ss.makeVmssVMName(ssName, instanceID)) + defer ss.vmssVMCache.Delete(key) + klog.V(2).Infof("azureDisk - update(%s): vm(%s) - detach disk(%s)", nodeResourceGroup, nodeName, diskName) - _, err = ss.VirtualMachineScaleSetVMsClient.Update(ctx, nodeResourceGroup, ssName, instanceID, vm) + _, err = ss.VirtualMachineScaleSetVMsClient.Update(ctx, nodeResourceGroup, ssName, instanceID, newVM) if err != nil { klog.Errorf("azureDisk - detach disk(%s) from %s failed, err: %v", diskName, nodeName, err) } else { klog.V(2).Infof("azureDisk - detach disk(%s) succeeded", diskName) - // Invalidate the cache right after updating - key := buildVmssCacheKey(nodeResourceGroup, ss.makeVmssVMName(ssName, instanceID)) - ss.vmssVMCache.Delete(key) } return err diff --git a/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/cloudprovider/providers/azure/azure_instances.go b/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/cloudprovider/providers/azure/azure_instances.go index 158ffb976ca8..abfaf331158d 100644 --- a/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/cloudprovider/providers/azure/azure_instances.go +++ b/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/cloudprovider/providers/azure/azure_instances.go @@ -96,7 +96,8 @@ func (az *Cloud) NodeAddresses(ctx context.Context, name types.NodeName) ([]v1.N addresses := []v1.NodeAddress{ {Type: v1.NodeHostName, Address: string(name)}, } - for _, address := range ipAddress.IPV4.IPAddress { + if len(ipAddress.IPV4.IPAddress) > 0 && len(ipAddress.IPV4.IPAddress[0].PrivateIP) > 0 { + address := ipAddress.IPV4.IPAddress[0] addresses = append(addresses, v1.NodeAddress{ Type: v1.NodeInternalIP, Address: address.PrivateIP, @@ -108,7 +109,8 @@ func (az *Cloud) NodeAddresses(ctx context.Context, name types.NodeName) ([]v1.N }) } } - for _, address := range ipAddress.IPV6.IPAddress { + if len(ipAddress.IPV6.IPAddress) > 0 && len(ipAddress.IPV6.IPAddress[0].PrivateIP) > 0 { + address := ipAddress.IPV6.IPAddress[0] addresses = append(addresses, v1.NodeAddress{ Type: v1.NodeInternalIP, Address: address.PrivateIP, @@ -120,6 +122,13 @@ func (az *Cloud) NodeAddresses(ctx context.Context, name types.NodeName) ([]v1.N }) } } + + if len(addresses) == 1 { + // No IP addresses is got from instance metadata service, clean up cache and report errors. + az.metadata.imsCache.Delete(metadataCacheKey) + return nil, fmt.Errorf("get empty IP addresses from instance metadata service") + } + return addresses, nil } diff --git a/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/cloudprovider/providers/gce/cloud/gen.go b/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/cloudprovider/providers/gce/cloud/gen.go index a3e7cd2c657a..f51ec77f0df0 100644 --- a/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/cloudprovider/providers/gce/cloud/gen.go +++ b/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/cloudprovider/providers/gce/cloud/gen.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright 2019 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. diff --git a/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/kubelet/BUILD b/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/kubelet/BUILD index fd5e6391c517..cdd40d9a99af 100644 --- a/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/kubelet/BUILD +++ b/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/kubelet/BUILD @@ -165,6 +165,7 @@ go_test( "kubelet_pods_windows_test.go", "kubelet_resources_test.go", "kubelet_test.go", + "kubelet_volumes_linux_test.go", "kubelet_volumes_test.go", "main_test.go", "oom_watcher_test.go", diff --git a/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/kubelet/config/defaults.go b/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/kubelet/config/defaults.go index 96ab9cebac8f..43f7162bfd8b 100644 --- a/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/kubelet/config/defaults.go +++ b/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/kubelet/config/defaults.go @@ -19,6 +19,7 @@ package config const ( DefaultKubeletPodsDirName = "pods" DefaultKubeletVolumesDirName = "volumes" + DefaultKubeletVolumeSubpathsDirName = "volume-subpaths" DefaultKubeletVolumeDevicesDirName = "volumeDevices" DefaultKubeletPluginsDirName = "plugins" DefaultKubeletPluginsRegistrationDirName = "plugins_registry" diff --git a/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/kubelet/kubelet_getters.go b/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/kubelet/kubelet_getters.go index eb05a578c077..a577a6bfad77 100644 --- a/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/kubelet/kubelet_getters.go +++ b/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/kubelet/kubelet_getters.go @@ -25,7 +25,7 @@ import ( cadvisorapiv1 "github.com/google/cadvisor/info/v1" "k8s.io/klog" - "k8s.io/api/core/v1" + v1 "k8s.io/api/core/v1" "k8s.io/apimachinery/pkg/types" "k8s.io/kubernetes/pkg/kubelet/cm" "k8s.io/kubernetes/pkg/kubelet/config" @@ -99,6 +99,13 @@ func (kl *Kubelet) getPodDir(podUID types.UID) string { return filepath.Join(kl.getPodsDir(), string(podUID)) } +// getPodVolumesSubpathsDir returns the full path to the per-pod subpaths directory under +// which subpath volumes are created for the specified pod. This directory may not +// exist if the pod does not exist or subpaths are not specified. +func (kl *Kubelet) getPodVolumeSubpathsDir(podUID types.UID) string { + return filepath.Join(kl.getPodDir(podUID), config.DefaultKubeletVolumeSubpathsDirName) +} + // getPodVolumesDir returns the full path to the per-pod data directory under // which volumes are created for the specified pod. This directory may not // exist if the pod does not exist. @@ -315,6 +322,19 @@ func (kl *Kubelet) getMountedVolumePathListFromDisk(podUID types.UID) ([]string, return mountedVolumes, nil } +// podVolumesSubpathsDirExists returns true if the pod volume-subpaths directory for +// a given pod exists +func (kl *Kubelet) podVolumeSubpathsDirExists(podUID types.UID) (bool, error) { + podVolDir := kl.getPodVolumeSubpathsDir(podUID) + + if pathExists, pathErr := volumeutil.PathExists(podVolDir); pathErr != nil { + return true, fmt.Errorf("Error checking if path %q exists: %v", podVolDir, pathErr) + } else if !pathExists { + return false, nil + } + return true, nil +} + // GetVersionInfo returns information about the version of cAdvisor in use. func (kl *Kubelet) GetVersionInfo() (*cadvisorapiv1.VersionInfo, error) { return kl.cadvisor.VersionInfo() diff --git a/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/kubelet/kubelet_volumes.go b/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/kubelet/kubelet_volumes.go index 7681ee6529e9..88b34c5efd11 100644 --- a/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/kubelet/kubelet_volumes.go +++ b/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/kubelet/kubelet_volumes.go @@ -19,7 +19,7 @@ package kubelet import ( "fmt" - "k8s.io/api/core/v1" + v1 "k8s.io/api/core/v1" "k8s.io/apimachinery/pkg/types" utilerrors "k8s.io/apimachinery/pkg/util/errors" "k8s.io/apimachinery/pkg/util/sets" @@ -114,6 +114,8 @@ func (kl *Kubelet) cleanupOrphanedPodDirs(pods []*v1.Pod, runningPods []*kubecon } // If volumes have not been unmounted/detached, do not delete directory. // Doing so may result in corruption of data. + // TODO: getMountedVolumePathListFromDisk() call may be redundant with + // kl.getPodVolumePathListFromDisk(). Can this be cleaned up? if podVolumesExist := kl.podVolumesExist(uid); podVolumesExist { klog.V(3).Infof("Orphaned pod %q found, but volumes are not cleaned up", uid) continue @@ -128,6 +130,18 @@ func (kl *Kubelet) cleanupOrphanedPodDirs(pods []*v1.Pod, runningPods []*kubecon orphanVolumeErrors = append(orphanVolumeErrors, fmt.Errorf("Orphaned pod %q found, but volume paths are still present on disk", uid)) continue } + + // If there are any volume-subpaths, do not cleanup directories + volumeSubpathExists, err := kl.podVolumeSubpathsDirExists(uid) + if err != nil { + orphanVolumeErrors = append(orphanVolumeErrors, fmt.Errorf("Orphaned pod %q found, but error %v occurred during reading of volume-subpaths dir from disk", uid, err)) + continue + } + if volumeSubpathExists { + orphanVolumeErrors = append(orphanVolumeErrors, fmt.Errorf("Orphaned pod %q found, but volume subpaths are still present on disk", uid)) + continue + } + klog.V(3).Infof("Orphaned pod %q found, removing", uid) if err := removeall.RemoveAllOneFilesystem(kl.mounter, kl.getPodDir(uid)); err != nil { klog.Errorf("Failed to remove orphaned pod %q dir; err: %v", uid, err) diff --git a/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/kubelet/kuberuntime/kuberuntime_sandbox.go b/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/kubelet/kuberuntime/kuberuntime_sandbox.go index dd51bda32ca9..cf0db44db069 100644 --- a/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/kubelet/kuberuntime/kuberuntime_sandbox.go +++ b/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/kubelet/kuberuntime/kuberuntime_sandbox.go @@ -57,6 +57,9 @@ func (m *kubeGenericRuntimeManager) createPodSandbox(pod *v1.Pod, attempt uint32 message := fmt.Sprintf("CreatePodSandbox for pod %q failed: %v", format.Pod(pod), err) return "", message, err } + if runtimeHandler != "" { + klog.V(2).Infof("Running pod %s with RuntimeHandler %q", format.Pod(pod), runtimeHandler) + } } podSandBoxID, err := m.runtimeService.RunPodSandbox(podSandboxConfig, runtimeHandler) diff --git a/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/kubelet/server/stats/BUILD b/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/kubelet/server/stats/BUILD index 6fec6f2eb998..dde9b3cbc7dc 100644 --- a/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/kubelet/server/stats/BUILD +++ b/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/kubelet/server/stats/BUILD @@ -18,6 +18,7 @@ go_library( "//pkg/kubelet/apis/stats/v1alpha1:go_default_library", "//pkg/kubelet/cm:go_default_library", "//pkg/kubelet/container:go_default_library", + "//pkg/kubelet/util:go_default_library", "//pkg/kubelet/util/format:go_default_library", "//pkg/volume:go_default_library", "//staging/src/k8s.io/api/core/v1:go_default_library", diff --git a/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/kubelet/server/stats/summary.go b/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/kubelet/server/stats/summary.go index fb646c5d2f31..93aef69ed87d 100644 --- a/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/kubelet/server/stats/summary.go +++ b/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/kubelet/server/stats/summary.go @@ -19,7 +19,11 @@ package stats import ( "fmt" + "k8s.io/klog" + + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" statsapi "k8s.io/kubernetes/pkg/kubelet/apis/stats/v1alpha1" + "k8s.io/kubernetes/pkg/kubelet/util" ) type SummaryProvider interface { @@ -32,6 +36,11 @@ type SummaryProvider interface { // summaryProviderImpl implements the SummaryProvider interface. type summaryProviderImpl struct { + // kubeletCreationTime is the time at which the summaryProvider was created. + kubeletCreationTime metav1.Time + // systemBootTime is the time at which the system was started + systemBootTime metav1.Time + provider StatsProvider } @@ -40,7 +49,18 @@ var _ SummaryProvider = &summaryProviderImpl{} // NewSummaryProvider returns a SummaryProvider using the stats provided by the // specified statsProvider. func NewSummaryProvider(statsProvider StatsProvider) SummaryProvider { - return &summaryProviderImpl{statsProvider} + kubeletCreationTime := metav1.Now() + bootTime, err := util.GetBootTime() + if err != nil { + // bootTime will be zero if we encounter an error getting the boot time. + klog.Warningf("Error getting system boot time. Node metrics will have an incorrect start time: %v", err) + } + + return &summaryProviderImpl{ + kubeletCreationTime: kubeletCreationTime, + systemBootTime: metav1.NewTime(bootTime), + provider: statsProvider, + } } func (sp *summaryProviderImpl) Get(updateStats bool) (*statsapi.Summary, error) { @@ -77,7 +97,7 @@ func (sp *summaryProviderImpl) Get(updateStats bool) (*statsapi.Summary, error) CPU: rootStats.CPU, Memory: rootStats.Memory, Network: networkStats, - StartTime: rootStats.StartTime, + StartTime: sp.systemBootTime, Fs: rootFsStats, Runtime: &statsapi.RuntimeStats{ImageFs: imageFsStats}, Rlimit: rlimit, diff --git a/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/kubelet/server/stats/summary_sys_containers.go b/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/kubelet/server/stats/summary_sys_containers.go index baaff0ab1bd6..4526f2a7695e 100644 --- a/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/kubelet/server/stats/summary_sys_containers.go +++ b/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/kubelet/server/stats/summary_sys_containers.go @@ -21,6 +21,7 @@ package stats import ( "k8s.io/klog" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" statsapi "k8s.io/kubernetes/pkg/kubelet/apis/stats/v1alpha1" "k8s.io/kubernetes/pkg/kubelet/cm" ) @@ -29,11 +30,12 @@ func (sp *summaryProviderImpl) GetSystemContainersStats(nodeConfig cm.NodeConfig systemContainers := map[string]struct { name string forceStatsUpdate bool + startTime metav1.Time }{ - statsapi.SystemContainerKubelet: {nodeConfig.KubeletCgroupsName, false}, - statsapi.SystemContainerRuntime: {nodeConfig.RuntimeCgroupsName, false}, - statsapi.SystemContainerMisc: {nodeConfig.SystemCgroupsName, false}, - statsapi.SystemContainerPods: {sp.provider.GetPodCgroupRoot(), updateStats}, + statsapi.SystemContainerKubelet: {name: nodeConfig.KubeletCgroupsName, forceStatsUpdate: false, startTime: sp.kubeletCreationTime}, + statsapi.SystemContainerRuntime: {name: nodeConfig.RuntimeCgroupsName, forceStatsUpdate: false}, + statsapi.SystemContainerMisc: {name: nodeConfig.SystemCgroupsName, forceStatsUpdate: false}, + statsapi.SystemContainerPods: {name: sp.provider.GetPodCgroupRoot(), forceStatsUpdate: updateStats}, } for sys, cont := range systemContainers { // skip if cgroup name is undefined (not all system containers are required) @@ -48,6 +50,11 @@ func (sp *summaryProviderImpl) GetSystemContainersStats(nodeConfig cm.NodeConfig // System containers don't have a filesystem associated with them. s.Logs, s.Rootfs = nil, nil s.Name = sys + + // if we know the start time of a system container, use that instead of the start time provided by cAdvisor + if !cont.startTime.IsZero() { + s.StartTime = cont.startTime + } stats = append(stats, *s) } @@ -58,11 +65,12 @@ func (sp *summaryProviderImpl) GetSystemContainersCPUAndMemoryStats(nodeConfig c systemContainers := map[string]struct { name string forceStatsUpdate bool + startTime metav1.Time }{ - statsapi.SystemContainerKubelet: {nodeConfig.KubeletCgroupsName, false}, - statsapi.SystemContainerRuntime: {nodeConfig.RuntimeCgroupsName, false}, - statsapi.SystemContainerMisc: {nodeConfig.SystemCgroupsName, false}, - statsapi.SystemContainerPods: {sp.provider.GetPodCgroupRoot(), updateStats}, + statsapi.SystemContainerKubelet: {name: nodeConfig.KubeletCgroupsName, forceStatsUpdate: false, startTime: sp.kubeletCreationTime}, + statsapi.SystemContainerRuntime: {name: nodeConfig.RuntimeCgroupsName, forceStatsUpdate: false}, + statsapi.SystemContainerMisc: {name: nodeConfig.SystemCgroupsName, forceStatsUpdate: false}, + statsapi.SystemContainerPods: {name: sp.provider.GetPodCgroupRoot(), forceStatsUpdate: updateStats}, } for sys, cont := range systemContainers { // skip if cgroup name is undefined (not all system containers are required) @@ -75,6 +83,11 @@ func (sp *summaryProviderImpl) GetSystemContainersCPUAndMemoryStats(nodeConfig c continue } s.Name = sys + + // if we know the start time of a system container, use that instead of the start time provided by cAdvisor + if !cont.startTime.IsZero() { + s.StartTime = cont.startTime + } stats = append(stats, *s) } diff --git a/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/kubelet/util/BUILD b/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/kubelet/util/BUILD index 4165864e0a30..7b590024861d 100644 --- a/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/kubelet/util/BUILD +++ b/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/kubelet/util/BUILD @@ -34,6 +34,8 @@ go_test( go_library( name = "go_default_library", srcs = [ + "boottime_util_darwin.go", + "boottime_util_linux.go", "doc.go", "util.go", "util_unix.go", diff --git a/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/kubelet/util/boottime_util_darwin.go b/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/kubelet/util/boottime_util_darwin.go new file mode 100644 index 000000000000..09d3b8865da0 --- /dev/null +++ b/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/kubelet/util/boottime_util_darwin.go @@ -0,0 +1,44 @@ +// +build darwin + +/* +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 util + +import ( + "fmt" + "syscall" + "time" + "unsafe" + + "golang.org/x/sys/unix" +) + +// GetBootTime returns the time at which the machine was started, truncated to the nearest second +func GetBootTime() (time.Time, error) { + output, err := unix.SysctlRaw("kern.boottime") + if err != nil { + return time.Time{}, err + } + var timeval syscall.Timeval + if len(output) != int(unsafe.Sizeof(timeval)) { + return time.Time{}, fmt.Errorf("unexpected output when calling syscall kern.bootime. Expected len(output) to be %v, but got %v", + int(unsafe.Sizeof(timeval)), len(output)) + } + timeval = *(*syscall.Timeval)(unsafe.Pointer(&output[0])) + sec, nsec := timeval.Unix() + return time.Unix(sec, nsec).Truncate(time.Second), nil +} diff --git a/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/kubelet/util/boottime_util_linux.go b/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/kubelet/util/boottime_util_linux.go new file mode 100644 index 000000000000..f00e7c06bfa5 --- /dev/null +++ b/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/kubelet/util/boottime_util_linux.go @@ -0,0 +1,36 @@ +// +build freebsd linux + +/* +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 util + +import ( + "fmt" + "time" + + "golang.org/x/sys/unix" +) + +// GetBootTime returns the time at which the machine was started, truncated to the nearest second +func GetBootTime() (time.Time, error) { + currentTime := time.Now() + var info unix.Sysinfo_t + if err := unix.Sysinfo(&info); err != nil { + return time.Time{}, fmt.Errorf("error getting system uptime: %s", err) + } + return currentTime.Add(-time.Duration(info.Uptime) * time.Second).Truncate(time.Second), nil +} diff --git a/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/kubelet/util/pluginwatcher/plugin_watcher.go b/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/kubelet/util/pluginwatcher/plugin_watcher.go index 9116222caeb8..a9f8422edf06 100644 --- a/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/kubelet/util/pluginwatcher/plugin_watcher.go +++ b/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/kubelet/util/pluginwatcher/plugin_watcher.go @@ -111,7 +111,7 @@ func (w *Watcher) Start() error { //TODO: Handle errors by taking corrective measures w.wg.Add(1) - go func() { + func() { defer w.wg.Done() if event.Op&fsnotify.Create == fsnotify.Create { diff --git a/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/kubelet/util/util_unsupported.go b/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/kubelet/util/util_unsupported.go index 6661678acedf..68a2bdf01b7e 100644 --- a/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/kubelet/util/util_unsupported.go +++ b/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/kubelet/util/util_unsupported.go @@ -45,3 +45,8 @@ func UnlockPath(fileHandles []uintptr) { func LocalEndpoint(path, file string) string { return "" } + +// GetBootTime empty implementation +func GetBootTime() (time.Time, error) { + return time.Time{}, fmt.Errorf("GetBootTime is unsupported in this build") +} diff --git a/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/kubelet/util/util_windows.go b/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/kubelet/util/util_windows.go index 7123728ff94a..92accc55e148 100644 --- a/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/kubelet/util/util_windows.go +++ b/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/kubelet/util/util_windows.go @@ -23,6 +23,7 @@ import ( "net" "net/url" "strings" + "syscall" "time" "github.com/Microsoft/go-winio" @@ -112,3 +113,15 @@ func LocalEndpoint(path, file string) string { } return u.String() + "//./pipe/" + file } + +var tickCount = syscall.NewLazyDLL("kernel32.dll").NewProc("GetTickCount64") + +// GetBootTime returns the time at which the machine was started, truncated to the nearest second +func GetBootTime() (time.Time, error) { + currentTime := time.Now() + output, _, err := tickCount.Call() + if errno, ok := err.(syscall.Errno); !ok || errno != 0 { + return time.Time{}, err + } + return currentTime.Add(-time.Duration(output) * time.Millisecond).Truncate(time.Second), nil +} diff --git a/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/kubelet/volumemanager/cache/desired_state_of_world.go b/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/kubelet/volumemanager/cache/desired_state_of_world.go index d4745ee0b1b9..1c748505a261 100644 --- a/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/kubelet/volumemanager/cache/desired_state_of_world.go +++ b/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/kubelet/volumemanager/cache/desired_state_of_world.go @@ -203,11 +203,12 @@ func (dsw *desiredStateOfWorld) AddPodToVolume( var volumeName v1.UniqueVolumeName - // The unique volume name used depends on whether the volume is attachable + // The unique volume name used depends on whether the volume is attachable/device-mountable // or not. attachable := dsw.isAttachableVolume(volumeSpec) - if attachable { - // For attachable volumes, use the unique volume name as reported by + deviceMountable := dsw.isDeviceMountableVolume(volumeSpec) + if attachable || deviceMountable { + // For attachable/device-mountable volumes, use the unique volume name as reported by // the plugin. volumeName, err = util.GetUniqueVolumeNameFromSpec(volumePlugin, volumeSpec) @@ -219,13 +220,11 @@ func (dsw *desiredStateOfWorld) AddPodToVolume( err) } } else { - // For non-attachable volumes, generate a unique name based on the pod + // For non-attachable and non-device-mountable volumes, generate a unique name based on the pod // namespace and name and the name of the volume within the pod. - volumeName = util.GetUniqueVolumeNameForNonAttachableVolume(podName, volumePlugin, volumeSpec) + volumeName = util.GetUniqueVolumeNameFromSpecWithPod(podName, volumePlugin, volumeSpec) } - deviceMountable := dsw.isDeviceMountableVolume(volumeSpec) - if _, volumeExists := dsw.volumesToMount[volumeName]; !volumeExists { dsw.volumesToMount[volumeName] = volumeToMount{ volumeName: volumeName, diff --git a/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/kubelet/volumemanager/reconciler/reconciler.go b/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/kubelet/volumemanager/reconciler/reconciler.go index 1b6bbbfbe778..f57d6bf26e95 100644 --- a/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/kubelet/volumemanager/reconciler/reconciler.go +++ b/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/kubelet/volumemanager/reconciler/reconciler.go @@ -455,6 +455,10 @@ func (rc *reconciler) reconstructVolume(volume podVolume) (*reconstructedVolume, if err != nil { return nil, err } + deviceMountablePlugin, err := rc.volumePluginMgr.FindDeviceMountablePluginByName(volume.pluginName) + if err != nil { + return nil, err + } // Create pod object pod := &v1.Pod{ @@ -480,13 +484,13 @@ func (rc *reconciler) reconstructVolume(volume podVolume) (*reconstructedVolume, } var uniqueVolumeName v1.UniqueVolumeName - if attachablePlugin != nil { + if attachablePlugin != nil || deviceMountablePlugin != nil { uniqueVolumeName, err = util.GetUniqueVolumeNameFromSpec(plugin, volumeSpec) if err != nil { return nil, err } } else { - uniqueVolumeName = util.GetUniqueVolumeNameForNonAttachableVolume(volume.podName, plugin, volumeSpec) + uniqueVolumeName = util.GetUniqueVolumeNameFromSpecWithPod(volume.podName, plugin, volumeSpec) } // Check existence of mount point for filesystem volume or symbolic link for block volume isExist, checkErr := rc.operationExecutor.CheckVolumeExistenceOperation(volumeSpec, volume.mountPath, volumeSpec.Name(), rc.mounter, uniqueVolumeName, volume.podName, pod.UID, attachablePlugin) diff --git a/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/proxy/ipvs/graceful_termination.go b/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/proxy/ipvs/graceful_termination.go index d9357d2c6d8c..4d53d4ee7b99 100644 --- a/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/proxy/ipvs/graceful_termination.go +++ b/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/proxy/ipvs/graceful_termination.go @@ -75,10 +75,10 @@ func (q *graceTerminateRSList) remove(rs *listItem) bool { uniqueRS := rs.String() if _, ok := q.list[uniqueRS]; ok { - return false + delete(q.list, uniqueRS) + return true } - delete(q.list, uniqueRS) - return true + return false } func (q *graceTerminateRSList) flushList(handler func(rsToDelete *listItem) (bool, error)) bool { @@ -164,7 +164,11 @@ func (m *GracefulTerminationManager) deleteRsFunc(rsToDelete *listItem) (bool, e } for _, rs := range rss { if rsToDelete.RealServer.Equal(rs) { - if rs.ActiveConn != 0 { + // Delete RS with no connections + // For UDP, ActiveConn is always 0 + // For TCP, InactiveConn are connections not in ESTABLISHED state + if rs.ActiveConn+rs.InactiveConn != 0 { + klog.Infof("Not deleting, RS %v: %v ActiveConn, %v InactiveConn", rsToDelete.String(), rs.ActiveConn, rs.InactiveConn) return false, nil } klog.Infof("Deleting rs: %s", rsToDelete.String()) diff --git a/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/proxy/ipvs/proxier.go b/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/proxy/ipvs/proxier.go index 242a6025ca62..9ca7e059d47d 100644 --- a/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/proxy/ipvs/proxier.go +++ b/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/proxy/ipvs/proxier.go @@ -162,6 +162,8 @@ const sysctlRouteLocalnet = "net/ipv4/conf/all/route_localnet" const sysctlBridgeCallIPTables = "net/bridge/bridge-nf-call-iptables" const sysctlVSConnTrack = "net/ipv4/vs/conntrack" const sysctlConnReuse = "net/ipv4/vs/conn_reuse_mode" +const sysctlExpireNoDestConn = "net/ipv4/vs/expire_nodest_conn" +const sysctlExpireQuiescentTemplate = "net/ipv4/vs/expire_quiescent_template" const sysctlForward = "net/ipv4/ip_forward" const sysctlArpIgnore = "net/ipv4/conf/all/arp_ignore" const sysctlArpAnnounce = "net/ipv4/conf/all/arp_announce" @@ -321,6 +323,20 @@ func NewProxier(ipt utiliptables.Interface, } } + // Set the expire_nodest_conn sysctl we need for + if val, _ := sysctl.GetSysctl(sysctlExpireNoDestConn); val != 1 { + if err := sysctl.SetSysctl(sysctlExpireNoDestConn, 1); err != nil { + return nil, fmt.Errorf("can't set sysctl %s: %v", sysctlExpireNoDestConn, err) + } + } + + // Set the expire_quiescent_template sysctl we need for + if val, _ := sysctl.GetSysctl(sysctlExpireQuiescentTemplate); val != 1 { + if err := sysctl.SetSysctl(sysctlExpireQuiescentTemplate, 1); err != nil { + return nil, fmt.Errorf("can't set sysctl %s: %v", sysctlExpireQuiescentTemplate, err) + } + } + // Set the ip_forward sysctl we need for if val, _ := sysctl.GetSysctl(sysctlForward); val != 1 { if err := sysctl.SetSysctl(sysctlForward, 1); err != nil { @@ -1190,7 +1206,15 @@ func (proxier *Proxier) syncProxyRules() { } proxier.portsMap = replacementPortsMap - // Clean up legacy IPVS services + // Get legacy bind address + // currentBindAddrs represents ip addresses bind to DefaultDummyDevice from the system + currentBindAddrs, err := proxier.netlinkHandle.ListBindAddress(DefaultDummyDevice) + if err != nil { + klog.Errorf("Failed to get bind address, err: %v", err) + } + legacyBindAddrs := proxier.getLegacyBindAddr(activeBindAddrs, currentBindAddrs) + + // Clean up legacy IPVS services and unbind addresses appliedSvcs, err := proxier.ipvs.GetVirtualServers() if err == nil { for _, appliedSvc := range appliedSvcs { @@ -1199,15 +1223,7 @@ func (proxier *Proxier) syncProxyRules() { } else { klog.Errorf("Failed to get ipvs service, err: %v", err) } - proxier.cleanLegacyService(activeIPVSServices, currentIPVSServices) - - // Clean up legacy bind address - // currentBindAddrs represents ip addresses bind to DefaultDummyDevice from the system - currentBindAddrs, err := proxier.netlinkHandle.ListBindAddress(DefaultDummyDevice) - if err != nil { - klog.Errorf("Failed to get bind address, err: %v", err) - } - proxier.cleanLegacyBindAddr(activeBindAddrs, currentBindAddrs) + proxier.cleanLegacyService(activeIPVSServices, currentIPVSServices, legacyBindAddrs) // Update healthz timestamp if proxier.healthzServer != nil { @@ -1602,32 +1618,41 @@ func (proxier *Proxier) syncEndpoint(svcPortName proxy.ServicePortName, onlyNode Port: uint16(portNum), } - klog.V(5).Infof("Using graceful delete to delete: %v", delDest) + klog.V(5).Infof("Using graceful delete to delete: %v", uniqueRS) err = proxier.gracefuldeleteManager.GracefulDeleteRS(appliedVirtualServer, delDest) if err != nil { - klog.Errorf("Failed to delete destination: %v, error: %v", delDest, err) + klog.Errorf("Failed to delete destination: %v, error: %v", uniqueRS, err) continue } } return nil } -func (proxier *Proxier) cleanLegacyService(activeServices map[string]bool, currentServices map[string]*utilipvs.VirtualServer) { +func (proxier *Proxier) cleanLegacyService(activeServices map[string]bool, currentServices map[string]*utilipvs.VirtualServer, legacyBindAddrs map[string]bool) { for cs := range currentServices { svc := currentServices[cs] if _, ok := activeServices[cs]; !ok { // This service was not processed in the latest sync loop so before deleting it, - // make sure it does not fall within an excluded CIDR range. okayToDelete := true rsList, _ := proxier.ipvs.GetRealServers(svc) + + // If we still have real servers graceful termination is not done + if len(rsList) > 0 { + okayToDelete = false + } + // Applying graceful termination to all real servers for _, rs := range rsList { uniqueRS := GetUniqueRSName(svc, rs) - // if there are in terminating real server in this service, then handle it later + // If RS is already in the graceful termination list, no need to add it again if proxier.gracefuldeleteManager.InTerminationList(uniqueRS) { - okayToDelete = false - break + continue + } + klog.V(5).Infof("Using graceful delete to delete: %v", uniqueRS) + if err := proxier.gracefuldeleteManager.GracefulDeleteRS(svc, rs); err != nil { + klog.Errorf("Failed to delete destination: %v, error: %v", uniqueRS, err) } } + // make sure it does not fall within an excluded CIDR range. for _, excludedCIDR := range proxier.excludeCIDRs { // Any validation of this CIDR already should have occurred. _, n, _ := net.ParseCIDR(excludedCIDR) @@ -1637,26 +1662,33 @@ func (proxier *Proxier) cleanLegacyService(activeServices map[string]bool, curre } } if okayToDelete { + klog.V(4).Infof("Delete service %s", svc.String()) if err := proxier.ipvs.DeleteVirtualServer(svc); err != nil { - klog.Errorf("Failed to delete service, error: %v", err) + klog.Errorf("Failed to delete service %s, error: %v", svc.String(), err) + } + addr := svc.Address.String() + if _, ok := legacyBindAddrs[addr]; ok { + klog.V(4).Infof("Unbinding address %s", addr) + if err := proxier.netlinkHandle.UnbindAddress(addr, DefaultDummyDevice); err != nil { + klog.Errorf("Failed to unbind service addr %s from dummy interface %s: %v", addr, DefaultDummyDevice, err) + } else { + // In case we delete a multi-port service, avoid trying to unbind multiple times + delete(legacyBindAddrs, addr) + } } } } } } -func (proxier *Proxier) cleanLegacyBindAddr(activeBindAddrs map[string]bool, currentBindAddrs []string) { +func (proxier *Proxier) getLegacyBindAddr(activeBindAddrs map[string]bool, currentBindAddrs []string) map[string]bool { + legacyAddrs := make(map[string]bool) for _, addr := range currentBindAddrs { if _, ok := activeBindAddrs[addr]; !ok { - // This address was not processed in the latest sync loop - klog.V(4).Infof("Unbind addr %s", addr) - err := proxier.netlinkHandle.UnbindAddress(addr, DefaultDummyDevice) - // Ignore no such address error when try to unbind address - if err != nil { - klog.Errorf("Failed to unbind service addr %s from dummy interface %s: %v", addr, DefaultDummyDevice, err) - } + legacyAddrs[addr] = true } } + return legacyAddrs } // Join all words with spaces, terminate with newline and write to buff. diff --git a/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/proxy/util/utils.go b/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/proxy/util/utils.go index f1db309a941e..2c1408da43b5 100644 --- a/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/proxy/util/utils.go +++ b/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/proxy/util/utils.go @@ -17,6 +17,8 @@ limitations under the License. package util import ( + "context" + "errors" "fmt" "net" @@ -35,6 +37,11 @@ const ( IPv6ZeroCIDR = "::/0" ) +var ( + ErrAddressNotAllowed = errors.New("address not allowed") + ErrNoAddresses = errors.New("No addresses for hostname") +) + func IsZeroCIDR(cidr string) bool { if cidr == IPv4ZeroCIDR || cidr == IPv6ZeroCIDR { return true @@ -42,6 +49,46 @@ func IsZeroCIDR(cidr string) bool { return false } +// IsProxyableIP checks if a given IP address is permitted to be proxied +func IsProxyableIP(ip string) error { + netIP := net.ParseIP(ip) + if netIP == nil { + return ErrAddressNotAllowed + } + return isProxyableIP(netIP) +} + +func isProxyableIP(ip net.IP) error { + if ip.IsLoopback() || ip.IsLinkLocalUnicast() || ip.IsLinkLocalMulticast() || ip.IsInterfaceLocalMulticast() { + return ErrAddressNotAllowed + } + return nil +} + +// Resolver is an interface for net.Resolver +type Resolver interface { + LookupIPAddr(ctx context.Context, host string) ([]net.IPAddr, error) +} + +// IsProxyableHostname checks if the IP addresses for a given hostname are permitted to be proxied +func IsProxyableHostname(ctx context.Context, resolv Resolver, hostname string) error { + resp, err := resolv.LookupIPAddr(ctx, hostname) + if err != nil { + return err + } + + if len(resp) == 0 { + return ErrNoAddresses + } + + for _, host := range resp { + if err := isProxyableIP(host.IP); err != nil { + return err + } + } + return nil +} + func IsLocalIP(ip string) (bool, error) { addrs, err := net.InterfaceAddrs() if err != nil { diff --git a/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/scheduler/algorithm/BUILD b/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/scheduler/algorithm/BUILD index 0b19967bafa4..da4b77ede200 100644 --- a/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/scheduler/algorithm/BUILD +++ b/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/scheduler/algorithm/BUILD @@ -17,7 +17,6 @@ go_library( deps = [ "//pkg/scheduler/api:go_default_library", "//pkg/scheduler/cache:go_default_library", - "//pkg/scheduler/internal/cache:go_default_library", "//staging/src/k8s.io/api/apps/v1:go_default_library", "//staging/src/k8s.io/api/core/v1:go_default_library", "//staging/src/k8s.io/api/policy/v1beta1:go_default_library", diff --git a/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/scheduler/algorithm/types.go b/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/scheduler/algorithm/types.go index 835a5a0bfb8a..f7b54e2d7e67 100644 --- a/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/scheduler/algorithm/types.go +++ b/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/scheduler/algorithm/types.go @@ -23,7 +23,6 @@ import ( "k8s.io/apimachinery/pkg/labels" schedulerapi "k8s.io/kubernetes/pkg/scheduler/api" schedulercache "k8s.io/kubernetes/pkg/scheduler/cache" - schedulerinternalcache "k8s.io/kubernetes/pkg/scheduler/internal/cache" ) // NodeFieldSelectorKeys is a map that: the key are node field selector keys; the values are @@ -92,6 +91,9 @@ type NodeLister interface { List() ([]*v1.Node, error) } +// PodFilter is a function to filter a pod. If pod passed return true else return false. +type PodFilter func(*v1.Pod) bool + // PodLister interface represents anything that can list pods for a scheduler. type PodLister interface { // We explicitly return []*v1.Pod, instead of v1.PodList, to avoid @@ -99,7 +101,7 @@ type PodLister interface { List(labels.Selector) ([]*v1.Pod, error) // This is similar to "List()", but the returned slice does not // contain pods that don't pass `podFilter`. - FilteredList(podFilter schedulerinternalcache.PodFilter, selector labels.Selector) ([]*v1.Pod, error) + FilteredList(podFilter PodFilter, selector labels.Selector) ([]*v1.Pod, error) } // ServiceLister interface represents anything that can produce a list of services; the list is consumed by a scheduler. diff --git a/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/scheduler/core/generic_scheduler.go b/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/scheduler/core/generic_scheduler.go index 5f163889c48f..e6740d566fe4 100644 --- a/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/scheduler/core/generic_scheduler.go +++ b/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/scheduler/core/generic_scheduler.go @@ -351,7 +351,7 @@ func (g *genericScheduler) processPreemptionWithExtenders( // worth the complexity, especially because we generally expect to have a very // small number of nominated pods per node. func (g *genericScheduler) getLowerPriorityNominatedPods(pod *v1.Pod, nodeName string) []*v1.Pod { - pods := g.schedulingQueue.WaitingPodsForNode(nodeName) + pods := g.schedulingQueue.NominatedPodsForNode(nodeName) if len(pods) == 0 { return nil @@ -501,7 +501,7 @@ func addNominatedPods(pod *v1.Pod, meta algorithm.PredicateMetadata, // This may happen only in tests. return false, meta, nodeInfo } - nominatedPods := queue.WaitingPodsForNode(nodeInfo.Node().Name) + nominatedPods := queue.NominatedPodsForNode(nodeInfo.Node().Name) if nominatedPods == nil || len(nominatedPods) == 0 { return false, meta, nodeInfo } @@ -655,24 +655,26 @@ func PrioritizeNodes( // DEPRECATED: we can remove this when all priorityConfigs implement the // Map-Reduce pattern. - workqueue.ParallelizeUntil(context.TODO(), 16, len(priorityConfigs), func(i int) { - priorityConfig := priorityConfigs[i] - if priorityConfig.Function == nil { + for i := range priorityConfigs { + if priorityConfigs[i].Function != nil { + wg.Add(1) + go func(index int) { + defer wg.Done() + var err error + results[index], err = priorityConfigs[index].Function(pod, nodeNameToInfo, nodes) + if err != nil { + appendError(err) + } + }(i) + } else { results[i] = make(schedulerapi.HostPriorityList, len(nodes)) - return } - - var err error - results[i], err = priorityConfig.Function(pod, nodeNameToInfo, nodes) - if err != nil { - appendError(err) - } - }) + } workqueue.ParallelizeUntil(context.TODO(), 16, len(nodes), func(index int) { nodeInfo := nodeNameToInfo[nodes[index].Name] - for i, priorityConfig := range priorityConfigs { - if priorityConfig.Function != nil { + for i := range priorityConfigs { + if priorityConfigs[i].Function != nil { continue } @@ -685,22 +687,22 @@ func PrioritizeNodes( } }) - for i, priorityConfig := range priorityConfigs { - if priorityConfig.Reduce == nil { + for i := range priorityConfigs { + if priorityConfigs[i].Reduce == nil { continue } wg.Add(1) - go func(index int, config algorithm.PriorityConfig) { + go func(index int) { defer wg.Done() - if err := config.Reduce(pod, meta, nodeNameToInfo, results[index]); err != nil { + if err := priorityConfigs[index].Reduce(pod, meta, nodeNameToInfo, results[index]); err != nil { appendError(err) } if klog.V(10) { for _, hostPriority := range results[index] { - klog.Infof("%v -> %v: %v, Score: (%d)", util.GetPodFullName(pod), hostPriority.Host, config.Name, hostPriority.Score) + klog.Infof("%v -> %v: %v, Score: (%d)", util.GetPodFullName(pod), hostPriority.Host, priorityConfigs[index].Name, hostPriority.Score) } } - }(i, priorityConfig) + }(i) } // Wait for all computations to be finished. wg.Wait() @@ -720,14 +722,14 @@ func PrioritizeNodes( if len(extenders) != 0 && nodes != nil { combinedScores := make(map[string]int, len(nodeNameToInfo)) - for _, extender := range extenders { - if !extender.IsInterested(pod) { + for i := range extenders { + if !extenders[i].IsInterested(pod) { continue } wg.Add(1) - go func(ext algorithm.SchedulerExtender) { + go func(extIndex int) { defer wg.Done() - prioritizedList, weight, err := ext.Prioritize(pod, nodes) + prioritizedList, weight, err := extenders[extIndex].Prioritize(pod, nodes) if err != nil { // Prioritization errors from extender can be ignored, let k8s/other extenders determine the priorities return @@ -736,12 +738,12 @@ func PrioritizeNodes( for i := range *prioritizedList { host, score := (*prioritizedList)[i].Host, (*prioritizedList)[i].Score if klog.V(10) { - klog.Infof("%v -> %v: %v, Score: (%d)", util.GetPodFullName(pod), host, ext.Name(), score) + klog.Infof("%v -> %v: %v, Score: (%d)", util.GetPodFullName(pod), host, extenders[extIndex].Name(), score) } combinedScores[host] += score * weight } mu.Unlock() - }(extender) + }(i) } // wait for all go routines to finish wg.Wait() diff --git a/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/scheduler/factory/BUILD b/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/scheduler/factory/BUILD index 7be893b06067..f7332ccdca84 100644 --- a/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/scheduler/factory/BUILD +++ b/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/scheduler/factory/BUILD @@ -73,6 +73,7 @@ go_test( "//pkg/scheduler/testing:go_default_library", "//pkg/scheduler/util:go_default_library", "//staging/src/k8s.io/api/core/v1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/api/resource:go_default_library", "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", "//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library", diff --git a/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/scheduler/factory/factory.go b/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/scheduler/factory/factory.go index aa420bcb173b..6242f3b485b9 100644 --- a/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/scheduler/factory/factory.go +++ b/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/scheduler/factory/factory.go @@ -992,7 +992,14 @@ func (c *configFactory) updateNodeInCache(oldObj, newObj interface{}) { } c.invalidateCachedPredicatesOnNodeUpdate(newNode, oldNode) - c.podQueue.MoveAllToActiveQueue() + // Only activate unschedulable pods if the node became more schedulable. + // We skip the node property comparison when there is no unschedulable pods in the queue + // to save processing cycles. We still trigger a move to active queue to cover the case + // that a pod being processed by the scheduler is determined unschedulable. We want this + // pod to be reevaluated when a change in the cluster happens. + if c.podQueue.NumUnschedulablePods() == 0 || nodeSchedulingPropertiesChanged(newNode, oldNode) { + c.podQueue.MoveAllToActiveQueue() + } } func (c *configFactory) invalidateCachedPredicatesOnNodeUpdate(newNode *v1.Node, oldNode *v1.Node) { @@ -1064,6 +1071,53 @@ func (c *configFactory) invalidateCachedPredicatesOnNodeUpdate(newNode *v1.Node, } } +func nodeSchedulingPropertiesChanged(newNode *v1.Node, oldNode *v1.Node) bool { + if nodeSpecUnschedulableChanged(newNode, oldNode) { + return true + } + if nodeAllocatableChanged(newNode, oldNode) { + return true + } + if nodeLabelsChanged(newNode, oldNode) { + return true + } + if nodeTaintsChanged(newNode, oldNode) { + return true + } + if nodeConditionsChanged(newNode, oldNode) { + return true + } + + return false +} + +func nodeAllocatableChanged(newNode *v1.Node, oldNode *v1.Node) bool { + return !reflect.DeepEqual(oldNode.Status.Allocatable, newNode.Status.Allocatable) +} + +func nodeLabelsChanged(newNode *v1.Node, oldNode *v1.Node) bool { + return !reflect.DeepEqual(oldNode.GetLabels(), newNode.GetLabels()) +} + +func nodeTaintsChanged(newNode *v1.Node, oldNode *v1.Node) bool { + return !reflect.DeepEqual(newNode.Spec.Taints, oldNode.Spec.Taints) +} + +func nodeConditionsChanged(newNode *v1.Node, oldNode *v1.Node) bool { + strip := func(conditions []v1.NodeCondition) map[v1.NodeConditionType]v1.ConditionStatus { + conditionStatuses := make(map[v1.NodeConditionType]v1.ConditionStatus, len(conditions)) + for i := range conditions { + conditionStatuses[conditions[i].Type] = conditions[i].Status + } + return conditionStatuses + } + return !reflect.DeepEqual(strip(oldNode.Status.Conditions), strip(newNode.Status.Conditions)) +} + +func nodeSpecUnschedulableChanged(newNode *v1.Node, oldNode *v1.Node) bool { + return newNode.Spec.Unschedulable != oldNode.Spec.Unschedulable && newNode.Spec.Unschedulable == false +} + func (c *configFactory) deleteNodeFromCache(obj interface{}) { var node *v1.Node switch t := obj.(type) { diff --git a/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/scheduler/internal/cache/BUILD b/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/scheduler/internal/cache/BUILD index 61202c8c2864..5b505704eae9 100644 --- a/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/scheduler/internal/cache/BUILD +++ b/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/scheduler/internal/cache/BUILD @@ -11,6 +11,7 @@ go_library( visibility = ["//visibility:public"], deps = [ "//pkg/features:go_default_library", + "//pkg/scheduler/algorithm:go_default_library", "//pkg/scheduler/cache:go_default_library", "//pkg/util/node:go_default_library", "//staging/src/k8s.io/api/core/v1:go_default_library", diff --git a/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/scheduler/internal/cache/cache.go b/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/scheduler/internal/cache/cache.go index 535236e5c1fb..3956fb28ee63 100644 --- a/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/scheduler/internal/cache/cache.go +++ b/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/scheduler/internal/cache/cache.go @@ -27,6 +27,7 @@ import ( "k8s.io/apimachinery/pkg/util/wait" utilfeature "k8s.io/apiserver/pkg/util/feature" "k8s.io/kubernetes/pkg/features" + "k8s.io/kubernetes/pkg/scheduler/algorithm" schedulercache "k8s.io/kubernetes/pkg/scheduler/cache" "k8s.io/klog" @@ -149,7 +150,7 @@ func (cache *schedulerCache) List(selector labels.Selector) ([]*v1.Pod, error) { return cache.FilteredList(alwaysTrue, selector) } -func (cache *schedulerCache) FilteredList(podFilter PodFilter, selector labels.Selector) ([]*v1.Pod, error) { +func (cache *schedulerCache) FilteredList(podFilter algorithm.PodFilter, selector labels.Selector) ([]*v1.Pod, error) { cache.mu.RLock() defer cache.mu.RUnlock() // podFilter is expected to return true for most or all of the pods. We diff --git a/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/scheduler/internal/cache/interface.go b/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/scheduler/internal/cache/interface.go index 878c2aa07411..4de292cea784 100644 --- a/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/scheduler/internal/cache/interface.go +++ b/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/scheduler/internal/cache/interface.go @@ -19,12 +19,10 @@ package cache import ( "k8s.io/api/core/v1" "k8s.io/apimachinery/pkg/labels" + "k8s.io/kubernetes/pkg/scheduler/algorithm" schedulercache "k8s.io/kubernetes/pkg/scheduler/cache" ) -// PodFilter is a function to filter a pod. If pod passed return true else return false. -type PodFilter func(*v1.Pod) bool - // Cache collects pods' information and provides node-level aggregated information. // It's intended for generic scheduler to do efficient lookup. // Cache's operations are pod centric. It does incremental updates based on pod events. @@ -106,7 +104,7 @@ type Cache interface { List(labels.Selector) ([]*v1.Pod, error) // FilteredList returns all cached pods that pass the filter. - FilteredList(filter PodFilter, selector labels.Selector) ([]*v1.Pod, error) + FilteredList(filter algorithm.PodFilter, selector labels.Selector) ([]*v1.Pod, error) // Snapshot takes a snapshot on current cache Snapshot() *Snapshot diff --git a/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/scheduler/internal/queue/BUILD b/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/scheduler/internal/queue/BUILD index c675f8592482..454c6ac67aed 100644 --- a/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/scheduler/internal/queue/BUILD +++ b/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/scheduler/internal/queue/BUILD @@ -12,6 +12,7 @@ go_library( "//pkg/scheduler/util:go_default_library", "//staging/src/k8s.io/api/core/v1:go_default_library", "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", "//staging/src/k8s.io/client-go/tools/cache:go_default_library", "//vendor/k8s.io/klog:go_default_library", ], @@ -22,9 +23,11 @@ go_test( srcs = ["scheduling_queue_test.go"], embed = [":go_default_library"], deps = [ + "//pkg/api/v1/pod:go_default_library", "//pkg/scheduler/util:go_default_library", "//staging/src/k8s.io/api/core/v1:go_default_library", "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", ], ) diff --git a/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/scheduler/internal/queue/scheduling_queue.go b/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/scheduler/internal/queue/scheduling_queue.go index 6f5aa682c98f..48f56ce77f43 100644 --- a/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/scheduler/internal/queue/scheduling_queue.go +++ b/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/scheduler/internal/queue/scheduling_queue.go @@ -36,6 +36,7 @@ import ( "k8s.io/api/core/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + ktypes "k8s.io/apimachinery/pkg/types" "k8s.io/client-go/tools/cache" podutil "k8s.io/kubernetes/pkg/api/v1/pod" "k8s.io/kubernetes/pkg/scheduler/algorithm/predicates" @@ -62,13 +63,18 @@ type SchedulingQueue interface { MoveAllToActiveQueue() AssignedPodAdded(pod *v1.Pod) AssignedPodUpdated(pod *v1.Pod) - WaitingPodsForNode(nodeName string) []*v1.Pod + NominatedPodsForNode(nodeName string) []*v1.Pod WaitingPods() []*v1.Pod // Close closes the SchedulingQueue so that the goroutine which is // waiting to pop items can exit gracefully. Close() + // UpdateNominatedPodForNode adds the given pod to the nominated pod map or + // updates it if it already exists. + UpdateNominatedPodForNode(pod *v1.Pod, nodeName string) // DeleteNominatedPodIfExists deletes nominatedPod from internal cache DeleteNominatedPodIfExists(pod *v1.Pod) + // NumUnschedulablePods returns the number of unschedulable pods exist in the SchedulingQueue. + NumUnschedulablePods() int } // NewSchedulingQueue initializes a new scheduling queue. If pod priority is @@ -148,9 +154,9 @@ func (f *FIFO) AssignedPodUpdated(pod *v1.Pod) {} // MoveAllToActiveQueue does nothing in FIFO as all pods are always in the active queue. func (f *FIFO) MoveAllToActiveQueue() {} -// WaitingPodsForNode returns pods that are nominated to run on the given node, +// NominatedPodsForNode returns pods that are nominated to run on the given node, // but FIFO does not support it. -func (f *FIFO) WaitingPodsForNode(nodeName string) []*v1.Pod { +func (f *FIFO) NominatedPodsForNode(nodeName string) []*v1.Pod { return nil } @@ -162,6 +168,14 @@ func (f *FIFO) Close() { // DeleteNominatedPodIfExists does nothing in FIFO. func (f *FIFO) DeleteNominatedPodIfExists(pod *v1.Pod) {} +// UpdateNominatedPodForNode does nothing in FIFO. +func (f *FIFO) UpdateNominatedPodForNode(pod *v1.Pod, nodeName string) {} + +// NumUnschedulablePods returns the number of unschedulable pods exist in the SchedulingQueue. +func (f *FIFO) NumUnschedulablePods() int { + return 0 +} + // NewFIFO creates a FIFO object. func NewFIFO() *FIFO { return &FIFO{FIFO: cache.NewFIFO(cache.MetaNamespaceKeyFunc)} @@ -187,10 +201,9 @@ type PriorityQueue struct { activeQ *Heap // unschedulableQ holds pods that have been tried and determined unschedulable. unschedulableQ *UnschedulablePodsMap - // nominatedPods is a map keyed by a node name and the value is a list of - // pods which are nominated to run on the node. These are pods which can be in - // the activeQ or unschedulableQ. - nominatedPods map[string][]*v1.Pod + // nominatedPods is a structures that stores pods which are nominated to run + // on nodes. + nominatedPods *nominatedPodMap // receivedMoveRequest is set to true whenever we receive a request to move a // pod from the unschedulableQ to the activeQ, and is set to false, when we pop // a pod from the activeQ. It indicates if we received a move request when a @@ -206,57 +219,38 @@ type PriorityQueue struct { // Making sure that PriorityQueue implements SchedulingQueue. var _ = SchedulingQueue(&PriorityQueue{}) +// podTimeStamp returns pod's last schedule time or its creation time if the +// scheduler has never tried scheduling it. +func podTimestamp(pod *v1.Pod) *metav1.Time { + _, condition := podutil.GetPodCondition(&pod.Status, v1.PodScheduled) + if condition == nil { + return &pod.CreationTimestamp + } + return &condition.LastTransitionTime +} + +// activeQComp is the function used by the activeQ heap algorithm to sort pods. +// It sorts pods based on their priority. When priorities are equal, it uses +// podTimestamp. +func activeQComp(pod1, pod2 interface{}) bool { + p1 := pod1.(*v1.Pod) + p2 := pod2.(*v1.Pod) + prio1 := util.GetPodPriority(p1) + prio2 := util.GetPodPriority(p2) + return (prio1 > prio2) || (prio1 == prio2 && podTimestamp(p1).Before(podTimestamp(p2))) +} + // NewPriorityQueue creates a PriorityQueue object. func NewPriorityQueue() *PriorityQueue { pq := &PriorityQueue{ - activeQ: newHeap(cache.MetaNamespaceKeyFunc, util.HigherPriorityPod), + activeQ: newHeap(cache.MetaNamespaceKeyFunc, activeQComp), unschedulableQ: newUnschedulablePodsMap(), - nominatedPods: map[string][]*v1.Pod{}, + nominatedPods: newNominatedPodMap(), } pq.cond.L = &pq.lock return pq } -// addNominatedPodIfNeeded adds a pod to nominatedPods if it has a NominatedNodeName and it does not -// already exist in the map. Adding an existing pod is not going to update the pod. -func (p *PriorityQueue) addNominatedPodIfNeeded(pod *v1.Pod) { - nnn := NominatedNodeName(pod) - if len(nnn) > 0 { - for _, np := range p.nominatedPods[nnn] { - if np.UID == pod.UID { - klog.V(4).Infof("Pod %v/%v already exists in the nominated map!", pod.Namespace, pod.Name) - return - } - } - p.nominatedPods[nnn] = append(p.nominatedPods[nnn], pod) - } -} - -// deleteNominatedPodIfExists deletes a pod from the nominatedPods. -// NOTE: this function assumes lock has been acquired in caller. -func (p *PriorityQueue) deleteNominatedPodIfExists(pod *v1.Pod) { - nnn := NominatedNodeName(pod) - if len(nnn) > 0 { - for i, np := range p.nominatedPods[nnn] { - if np.UID == pod.UID { - p.nominatedPods[nnn] = append(p.nominatedPods[nnn][:i], p.nominatedPods[nnn][i+1:]...) - if len(p.nominatedPods[nnn]) == 0 { - delete(p.nominatedPods, nnn) - } - break - } - } - } -} - -// updateNominatedPod updates a pod in the nominatedPods. -func (p *PriorityQueue) updateNominatedPod(oldPod, newPod *v1.Pod) { - // Even if the nominated node name of the Pod is not changed, we must delete and add it again - // to ensure that its pointer is updated. - p.deleteNominatedPodIfExists(oldPod) - p.addNominatedPodIfNeeded(newPod) -} - // Add adds a pod to the active queue. It should be called only when a new pod // is added so there is no chance the pod is already in either queue. func (p *PriorityQueue) Add(pod *v1.Pod) error { @@ -268,10 +262,9 @@ func (p *PriorityQueue) Add(pod *v1.Pod) error { } else { if p.unschedulableQ.get(pod) != nil { klog.Errorf("Error: pod %v/%v is already in the unschedulable queue.", pod.Namespace, pod.Name) - p.deleteNominatedPodIfExists(pod) p.unschedulableQ.delete(pod) } - p.addNominatedPodIfNeeded(pod) + p.nominatedPods.add(pod, "") p.cond.Broadcast() } return err @@ -292,7 +285,7 @@ func (p *PriorityQueue) AddIfNotPresent(pod *v1.Pod) error { if err != nil { klog.Errorf("Error adding pod %v/%v to the scheduling queue: %v", pod.Namespace, pod.Name, err) } else { - p.addNominatedPodIfNeeded(pod) + p.nominatedPods.add(pod, "") p.cond.Broadcast() } return err @@ -317,12 +310,12 @@ func (p *PriorityQueue) AddUnschedulableIfNotPresent(pod *v1.Pod) error { } if !p.receivedMoveRequest && isPodUnschedulable(pod) { p.unschedulableQ.addOrUpdate(pod) - p.addNominatedPodIfNeeded(pod) + p.nominatedPods.add(pod, "") return nil } err := p.activeQ.Add(pod) if err == nil { - p.addNominatedPodIfNeeded(pod) + p.nominatedPods.add(pod, "") p.cond.Broadcast() } return err @@ -373,13 +366,13 @@ func (p *PriorityQueue) Update(oldPod, newPod *v1.Pod) error { defer p.lock.Unlock() // If the pod is already in the active queue, just update it there. if _, exists, _ := p.activeQ.Get(newPod); exists { - p.updateNominatedPod(oldPod, newPod) + p.nominatedPods.update(oldPod, newPod) err := p.activeQ.Update(newPod) return err } // If the pod is in the unschedulable queue, updating it may make it schedulable. if usPod := p.unschedulableQ.get(newPod); usPod != nil { - p.updateNominatedPod(oldPod, newPod) + p.nominatedPods.update(oldPod, newPod) if isPodUpdated(oldPod, newPod) { p.unschedulableQ.delete(usPod) err := p.activeQ.Add(newPod) @@ -394,7 +387,7 @@ func (p *PriorityQueue) Update(oldPod, newPod *v1.Pod) error { // If pod is not in any of the two queue, we put it in the active queue. err := p.activeQ.Add(newPod) if err == nil { - p.addNominatedPodIfNeeded(newPod) + p.nominatedPods.add(newPod, "") p.cond.Broadcast() } return err @@ -405,7 +398,7 @@ func (p *PriorityQueue) Update(oldPod, newPod *v1.Pod) error { func (p *PriorityQueue) Delete(pod *v1.Pod) error { p.lock.Lock() defer p.lock.Unlock() - p.deleteNominatedPodIfExists(pod) + p.nominatedPods.delete(pod) err := p.activeQ.Delete(pod) if err != nil { // The item was probably not found in the activeQ. p.unschedulableQ.delete(pod) @@ -488,16 +481,13 @@ func (p *PriorityQueue) getUnschedulablePodsWithMatchingAffinityTerm(pod *v1.Pod return podsToMove } -// WaitingPodsForNode returns pods that are nominated to run on the given node, +// NominatedPodsForNode returns pods that are nominated to run on the given node, // but they are waiting for other pods to be removed from the node before they // can be actually scheduled. -func (p *PriorityQueue) WaitingPodsForNode(nodeName string) []*v1.Pod { +func (p *PriorityQueue) NominatedPodsForNode(nodeName string) []*v1.Pod { p.lock.RLock() defer p.lock.RUnlock() - if list, ok := p.nominatedPods[nodeName]; ok { - return list - } - return nil + return p.nominatedPods.podsForNode(nodeName) } // WaitingPods returns all the waiting pods in the queue. @@ -523,13 +513,30 @@ func (p *PriorityQueue) Close() { p.cond.Broadcast() } -// DeleteNominatedPodIfExists deletes pod from internal cache if it's a nominatedPod +// DeleteNominatedPodIfExists deletes pod nominatedPods. func (p *PriorityQueue) DeleteNominatedPodIfExists(pod *v1.Pod) { p.lock.Lock() - p.deleteNominatedPodIfExists(pod) + p.nominatedPods.delete(pod) + p.lock.Unlock() +} + +// UpdateNominatedPodForNode adds a pod to the nominated pods of the given node. +// This is called during the preemption process after a node is nominated to run +// the pod. We update the structure before sending a request to update the pod +// object to avoid races with the following scheduling cycles. +func (p *PriorityQueue) UpdateNominatedPodForNode(pod *v1.Pod, nodeName string) { + p.lock.Lock() + p.nominatedPods.add(pod, nodeName) p.lock.Unlock() } +// NumUnschedulablePods returns the number of unschedulable pods exist in the SchedulingQueue. +func (p *PriorityQueue) NumUnschedulablePods() int { + p.lock.RLock() + defer p.lock.RUnlock() + return len(p.unschedulableQ.pods) +} + // UnschedulablePodsMap holds pods that cannot be scheduled. This data structure // is used to implement unschedulableQ. type UnschedulablePodsMap struct { @@ -767,3 +774,77 @@ func newHeap(keyFn KeyFunc, lessFn LessFunc) *Heap { }, } } + +// nominatedPodMap is a structure that stores pods nominated to run on nodes. +// It exists because nominatedNodeName of pod objects stored in the structure +// may be different than what scheduler has here. We should be able to find pods +// by their UID and update/delete them. +type nominatedPodMap struct { + // nominatedPods is a map keyed by a node name and the value is a list of + // pods which are nominated to run on the node. These are pods which can be in + // the activeQ or unschedulableQ. + nominatedPods map[string][]*v1.Pod + // nominatedPodToNode is map keyed by a Pod UID to the node name where it is + // nominated. + nominatedPodToNode map[ktypes.UID]string +} + +func (npm *nominatedPodMap) add(p *v1.Pod, nodeName string) { + // always delete the pod if it already exist, to ensure we never store more than + // one instance of the pod. + npm.delete(p) + + nnn := nodeName + if len(nnn) == 0 { + nnn = NominatedNodeName(p) + if len(nnn) == 0 { + return + } + } + npm.nominatedPodToNode[p.UID] = nnn + for _, np := range npm.nominatedPods[nnn] { + if np.UID == p.UID { + klog.V(4).Infof("Pod %v/%v already exists in the nominated map!", p.Namespace, p.Name) + return + } + } + npm.nominatedPods[nnn] = append(npm.nominatedPods[nnn], p) +} + +func (npm *nominatedPodMap) delete(p *v1.Pod) { + nnn, ok := npm.nominatedPodToNode[p.UID] + if !ok { + return + } + for i, np := range npm.nominatedPods[nnn] { + if np.UID == p.UID { + npm.nominatedPods[nnn] = append(npm.nominatedPods[nnn][:i], npm.nominatedPods[nnn][i+1:]...) + if len(npm.nominatedPods[nnn]) == 0 { + delete(npm.nominatedPods, nnn) + } + break + } + } + delete(npm.nominatedPodToNode, p.UID) +} + +func (npm *nominatedPodMap) update(oldPod, newPod *v1.Pod) { + // We update irrespective of the nominatedNodeName changed or not, to ensure + // that pod pointer is updated. + npm.delete(oldPod) + npm.add(newPod, "") +} + +func (npm *nominatedPodMap) podsForNode(nodeName string) []*v1.Pod { + if list, ok := npm.nominatedPods[nodeName]; ok { + return list + } + return nil +} + +func newNominatedPodMap() *nominatedPodMap { + return &nominatedPodMap{ + nominatedPods: make(map[string][]*v1.Pod), + nominatedPodToNode: make(map[ktypes.UID]string), + } +} diff --git a/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/util/ipvs/ipvs_linux.go b/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/util/ipvs/ipvs_linux.go index b4f53be6fdb9..54dac294262d 100644 --- a/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/util/ipvs/ipvs_linux.go +++ b/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/util/ipvs/ipvs_linux.go @@ -23,6 +23,7 @@ import ( "fmt" "net" "strings" + "sync" "syscall" libipvs "github.com/docker/libnetwork/ipvs" @@ -34,6 +35,7 @@ import ( type runner struct { exec utilexec.Interface ipvsHandle *libipvs.Handle + mu sync.Mutex // Protect Netlink calls } // Protocol is the IPVS service protocol type @@ -58,6 +60,8 @@ func (runner *runner) AddVirtualServer(vs *VirtualServer) error { if err != nil { return err } + runner.mu.Lock() + defer runner.mu.Unlock() return runner.ipvsHandle.NewService(svc) } @@ -67,6 +71,8 @@ func (runner *runner) UpdateVirtualServer(vs *VirtualServer) error { if err != nil { return err } + runner.mu.Lock() + defer runner.mu.Unlock() return runner.ipvsHandle.UpdateService(svc) } @@ -76,6 +82,8 @@ func (runner *runner) DeleteVirtualServer(vs *VirtualServer) error { if err != nil { return err } + runner.mu.Lock() + defer runner.mu.Unlock() return runner.ipvsHandle.DelService(svc) } @@ -85,7 +93,10 @@ func (runner *runner) GetVirtualServer(vs *VirtualServer) (*VirtualServer, error if err != nil { return nil, err } + runner.mu.Lock() ipvsSvc, err := runner.ipvsHandle.GetService(svc) + runner.mu.Unlock() + if err != nil { return nil, err } @@ -98,7 +109,9 @@ func (runner *runner) GetVirtualServer(vs *VirtualServer) (*VirtualServer, error // GetVirtualServers is part of ipvs.Interface. func (runner *runner) GetVirtualServers() ([]*VirtualServer, error) { + runner.mu.Lock() ipvsSvcs, err := runner.ipvsHandle.GetServices() + runner.mu.Unlock() if err != nil { return nil, err } @@ -115,6 +128,8 @@ func (runner *runner) GetVirtualServers() ([]*VirtualServer, error) { // Flush is part of ipvs.Interface. Currently we delete IPVS services one by one func (runner *runner) Flush() error { + runner.mu.Lock() + defer runner.mu.Unlock() return runner.ipvsHandle.Flush() } @@ -128,6 +143,8 @@ func (runner *runner) AddRealServer(vs *VirtualServer, rs *RealServer) error { if err != nil { return err } + runner.mu.Lock() + defer runner.mu.Unlock() return runner.ipvsHandle.NewDestination(svc, dst) } @@ -141,6 +158,8 @@ func (runner *runner) DeleteRealServer(vs *VirtualServer, rs *RealServer) error if err != nil { return err } + runner.mu.Lock() + defer runner.mu.Unlock() return runner.ipvsHandle.DelDestination(svc, dst) } @@ -153,6 +172,8 @@ func (runner *runner) UpdateRealServer(vs *VirtualServer, rs *RealServer) error if err != nil { return err } + runner.mu.Lock() + defer runner.mu.Unlock() return runner.ipvsHandle.UpdateDestination(svc, dst) } @@ -162,7 +183,9 @@ func (runner *runner) GetRealServers(vs *VirtualServer) ([]*RealServer, error) { if err != nil { return nil, err } + runner.mu.Lock() dsts, err := runner.ipvsHandle.GetDestinations(svc) + runner.mu.Unlock() if err != nil { return nil, err } diff --git a/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/util/mount/BUILD b/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/util/mount/BUILD index 221afb7a9c65..c9b9ce8a47e6 100644 --- a/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/util/mount/BUILD +++ b/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/util/mount/BUILD @@ -9,6 +9,7 @@ go_library( "exec_mount_unsupported.go", "fake.go", "mount.go", + "mount_helper.go", "mount_linux.go", "mount_unsupported.go", "mount_windows.go", @@ -67,6 +68,7 @@ go_test( name = "go_default_test", srcs = [ "exec_mount_test.go", + "mount_helper_test.go", "mount_linux_test.go", "mount_test.go", "mount_windows_test.go", diff --git a/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/util/mount/fake.go b/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/util/mount/fake.go index 06e0fcccdc16..0e2952f3e02d 100644 --- a/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/util/mount/fake.go +++ b/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/util/mount/fake.go @@ -30,6 +30,8 @@ type FakeMounter struct { MountPoints []MountPoint Log []FakeAction Filesystem map[string]FileType + // Error to return for a path when calling IsLikelyNotMountPoint + MountCheckErrors map[string]error // Some tests run things in parallel, make sure the mounter does not produce // any golang's DATA RACE warnings. mutex sync.Mutex @@ -119,6 +121,7 @@ func (f *FakeMounter) Unmount(target string) error { } f.MountPoints = newMountpoints f.Log = append(f.Log, FakeAction{Action: FakeActionUnmount, Target: absTarget}) + delete(f.MountCheckErrors, target) return nil } @@ -141,7 +144,12 @@ func (f *FakeMounter) IsLikelyNotMountPoint(file string) (bool, error) { f.mutex.Lock() defer f.mutex.Unlock() - _, err := os.Stat(file) + err := f.MountCheckErrors[file] + if err != nil { + return false, err + } + + _, err = os.Stat(file) if err != nil { return true, err } diff --git a/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/util/mount/mount_helper.go b/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/util/mount/mount_helper.go new file mode 100644 index 000000000000..a06871e4789e --- /dev/null +++ b/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/util/mount/mount_helper.go @@ -0,0 +1,124 @@ +/* +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 mount + +import ( + "fmt" + "os" + "syscall" + + "k8s.io/klog" +) + +// CleanupMountPoint unmounts the given path and +// deletes the remaining directory if successful. +// if extensiveMountPointCheck is true +// IsNotMountPoint will be called instead of IsLikelyNotMountPoint. +// IsNotMountPoint is more expensive but properly handles bind mounts within the same fs. +func CleanupMountPoint(mountPath string, mounter Interface, extensiveMountPointCheck bool) error { + // mounter.ExistsPath cannot be used because for containerized kubelet, we need to check + // the path in the kubelet container, not on the host. + pathExists, pathErr := PathExists(mountPath) + if !pathExists { + klog.Warningf("Warning: Unmount skipped because path does not exist: %v", mountPath) + return nil + } + corruptedMnt := IsCorruptedMnt(pathErr) + if pathErr != nil && !corruptedMnt { + return fmt.Errorf("Error checking path: %v", pathErr) + } + return doCleanupMountPoint(mountPath, mounter, extensiveMountPointCheck, corruptedMnt) +} + +// doCleanupMountPoint unmounts the given path and +// deletes the remaining directory if successful. +// if extensiveMountPointCheck is true +// IsNotMountPoint will be called instead of IsLikelyNotMountPoint. +// IsNotMountPoint is more expensive but properly handles bind mounts within the same fs. +// if corruptedMnt is true, it means that the mountPath is a corrupted mountpoint, and the mount point check +// will be skipped +func doCleanupMountPoint(mountPath string, mounter Interface, extensiveMountPointCheck bool, corruptedMnt bool) error { + if !corruptedMnt { + var notMnt bool + var err error + if extensiveMountPointCheck { + notMnt, err = IsNotMountPoint(mounter, mountPath) + } else { + notMnt, err = mounter.IsLikelyNotMountPoint(mountPath) + } + + if err != nil { + return err + } + + if notMnt { + klog.Warningf("Warning: %q is not a mountpoint, deleting", mountPath) + return os.Remove(mountPath) + } + } + + // Unmount the mount path + klog.V(4).Infof("%q is a mountpoint, unmounting", mountPath) + if err := mounter.Unmount(mountPath); err != nil { + return err + } + + notMnt, mntErr := mounter.IsLikelyNotMountPoint(mountPath) + if mntErr != nil { + return mntErr + } + if notMnt { + klog.V(4).Infof("%q is unmounted, deleting the directory", mountPath) + return os.Remove(mountPath) + } + return fmt.Errorf("Failed to unmount path %v", mountPath) +} + +// TODO: clean this up to use pkg/util/file/FileExists +// PathExists returns true if the specified path exists. +func PathExists(path string) (bool, error) { + _, err := os.Stat(path) + if err == nil { + return true, nil + } else if os.IsNotExist(err) { + return false, nil + } else if IsCorruptedMnt(err) { + return true, err + } else { + return false, err + } +} + +// IsCorruptedMnt return true if err is about corrupted mount point +func IsCorruptedMnt(err error) bool { + if err == nil { + return false + } + var underlyingError error + switch pe := err.(type) { + case nil: + return false + case *os.PathError: + underlyingError = pe.Err + case *os.LinkError: + underlyingError = pe.Err + case *os.SyscallError: + underlyingError = pe.Err + } + + return underlyingError == syscall.ENOTCONN || underlyingError == syscall.ESTALE || underlyingError == syscall.EIO +} diff --git a/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/util/mount/mount_linux.go b/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/util/mount/mount_linux.go index 6ebeff053b59..85a901696875 100644 --- a/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/util/mount/mount_linux.go +++ b/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/util/mount/mount_linux.go @@ -55,6 +55,7 @@ const ( fsckErrorsUncorrected = 4 // place for subpath mounts + // TODO: pass in directory using kubelet_getters instead containerSubPathDirectoryName = "volume-subpaths" // syscall.Openat flags used to traverse directories not following symlinks nofollowFlags = unix.O_RDONLY | unix.O_NOFOLLOW @@ -890,15 +891,22 @@ func doCleanSubPaths(mounter Interface, podDir string, volumeName string) error // scan /var/lib/kubelet/pods//volume-subpaths///* fullContainerDirPath := filepath.Join(subPathDir, containerDir.Name()) - subPaths, err := ioutil.ReadDir(fullContainerDirPath) - if err != nil { - return fmt.Errorf("error reading %s: %s", fullContainerDirPath, err) - } - for _, subPath := range subPaths { - if err = doCleanSubPath(mounter, fullContainerDirPath, subPath.Name()); err != nil { + err = filepath.Walk(fullContainerDirPath, func(path string, info os.FileInfo, err error) error { + if path == fullContainerDirPath { + // Skip top level directory + return nil + } + + // pass through errors and let doCleanSubPath handle them + if err = doCleanSubPath(mounter, fullContainerDirPath, filepath.Base(path)); err != nil { return err } + return nil + }) + if err != nil { + return fmt.Errorf("error processing %s: %s", fullContainerDirPath, err) } + // Whole container has been processed, remove its directory. if err := os.Remove(fullContainerDirPath); err != nil { return fmt.Errorf("error deleting %s: %s", fullContainerDirPath, err) @@ -925,22 +933,12 @@ func doCleanSubPath(mounter Interface, fullContainerDirPath, subPathIndex string // process /var/lib/kubelet/pods//volume-subpaths/// klog.V(4).Infof("Cleaning up subpath mounts for subpath %v", subPathIndex) fullSubPath := filepath.Join(fullContainerDirPath, subPathIndex) - notMnt, err := IsNotMountPoint(mounter, fullSubPath) - if err != nil { - return fmt.Errorf("error checking %s for mount: %s", fullSubPath, err) - } - // Unmount it - if !notMnt { - if err = mounter.Unmount(fullSubPath); err != nil { - return fmt.Errorf("error unmounting %s: %s", fullSubPath, err) - } - klog.V(5).Infof("Unmounted %s", fullSubPath) - } - // Remove it *non*-recursively, just in case there were some hiccups. - if err = os.Remove(fullSubPath); err != nil { - return fmt.Errorf("error deleting %s: %s", fullSubPath, err) + + if err := CleanupMountPoint(fullSubPath, mounter, true); err != nil { + return fmt.Errorf("error cleaning subpath mount %s: %s", fullSubPath, err) } - klog.V(5).Infof("Removed %s", fullSubPath) + + klog.V(4).Infof("Successfully cleaned subpath directory %s", fullSubPath) return nil } diff --git a/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/volume/azure_dd/azure_common.go b/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/volume/azure_dd/azure_common.go index 9de53fe3368e..174510c5d1b0 100644 --- a/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/volume/azure_dd/azure_common.go +++ b/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/volume/azure_dd/azure_common.go @@ -40,7 +40,7 @@ import ( const ( defaultStorageAccountType = compute.StandardLRS defaultAzureDiskKind = v1.AzureManagedDisk - defaultAzureDataDiskCachingMode = v1.AzureDataDiskCachingNone + defaultAzureDataDiskCachingMode = v1.AzureDataDiskCachingReadOnly ) type dataDisk struct { diff --git a/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/volume/azure_dd/azure_dd.go b/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/volume/azure_dd/azure_dd.go index 961d5a35714a..4a082addf1b5 100644 --- a/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/volume/azure_dd/azure_dd.go +++ b/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/volume/azure_dd/azure_dd.go @@ -187,7 +187,7 @@ func getMaxDataDiskCount(instanceType string, sizeList *[]compute.VirtualMachine continue } if strings.ToUpper(*size.Name) == vmsize { - klog.V(2).Infof("got a matching size in getMaxDataDiskCount, Name: %s, MaxDataDiskCount: %d", *size.Name, *size.MaxDataDiskCount) + klog.V(12).Infof("got a matching size in getMaxDataDiskCount, Name: %s, MaxDataDiskCount: %d", *size.Name, *size.MaxDataDiskCount) return int64(*size.MaxDataDiskCount) } } diff --git a/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/volume/csi/csi_plugin.go b/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/volume/csi/csi_plugin.go index 1732dc7f9231..35f20dc69101 100644 --- a/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/volume/csi/csi_plugin.go +++ b/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/volume/csi/csi_plugin.go @@ -705,15 +705,15 @@ func highestSupportedVersion(versions []string) (*utilversion.Version, error) { return nil, fmt.Errorf("None of the CSI versions reported by this driver are supported") } -// Only CSI 0.x drivers are allowed to use deprecated socket dir. +// Only drivers that implement CSI 0.x are allowed to use deprecated socket dir. func isDeprecatedSocketDirAllowed(versions []string) bool { for _, version := range versions { - if !isV0Version(version) { - return false + if isV0Version(version) { + return true } } - return true + return false } func isV0Version(version string) bool { diff --git a/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/volume/portworx/portworx.go b/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/volume/portworx/portworx.go index 212a4c23d796..e2cb8982986d 100644 --- a/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/volume/portworx/portworx.go +++ b/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/volume/portworx/portworx.go @@ -20,6 +20,7 @@ import ( "fmt" "os" + volumeclient "github.com/libopenstorage/openstorage/api/client/volume" "k8s.io/api/core/v1" "k8s.io/apimachinery/pkg/api/resource" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" @@ -43,7 +44,7 @@ func ProbeVolumePlugins() []volume.VolumePlugin { type portworxVolumePlugin struct { host volume.VolumeHost - util *PortworxVolumeUtil + util *portworxVolumeUtil } var _ volume.VolumePlugin = &portworxVolumePlugin{} @@ -61,8 +62,18 @@ func getPath(uid types.UID, volName string, host volume.VolumeHost) string { } func (plugin *portworxVolumePlugin) Init(host volume.VolumeHost) error { + client, err := volumeclient.NewDriverClient( + fmt.Sprintf("http://%s:%d", host.GetHostName(), osdMgmtDefaultPort), + pxdDriverName, osdDriverVersion, pxDriverName) + if err != nil { + return err + } + plugin.host = host - plugin.util = &PortworxVolumeUtil{} + plugin.util = &portworxVolumeUtil{ + portworxClient: client, + } + return nil } diff --git a/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/volume/portworx/portworx_util.go b/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/volume/portworx/portworx_util.go index 62b3e3f4d317..7ac5522dac1f 100644 --- a/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/volume/portworx/portworx_util.go +++ b/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/volume/portworx/portworx_util.go @@ -34,22 +34,22 @@ import ( ) const ( - osdMgmtPort = "9001" - osdDriverVersion = "v1" - pxdDriverName = "pxd" - pvcClaimLabel = "pvc" - pvcNamespaceLabel = "namespace" - pxServiceName = "portworx-service" - pxDriverName = "pxd-sched" + osdMgmtDefaultPort = 9001 + osdDriverVersion = "v1" + pxdDriverName = "pxd" + pvcClaimLabel = "pvc" + pvcNamespaceLabel = "namespace" + pxServiceName = "portworx-service" + pxDriverName = "pxd-sched" ) -type PortworxVolumeUtil struct { +type portworxVolumeUtil struct { portworxClient *osdclient.Client } // CreateVolume creates a Portworx volume. -func (util *PortworxVolumeUtil) CreateVolume(p *portworxVolumeProvisioner) (string, int64, map[string]string, error) { - driver, err := util.getPortworxDriver(p.plugin.host, false /*localOnly*/) +func (util *portworxVolumeUtil) CreateVolume(p *portworxVolumeProvisioner) (string, int64, map[string]string, error) { + driver, err := util.getPortworxDriver(p.plugin.host) if err != nil || driver == nil { klog.Errorf("Failed to get portworx driver. Err: %v", err) return "", 0, nil, err @@ -112,8 +112,8 @@ func (util *PortworxVolumeUtil) CreateVolume(p *portworxVolumeProvisioner) (stri } // DeleteVolume deletes a Portworx volume -func (util *PortworxVolumeUtil) DeleteVolume(d *portworxVolumeDeleter) error { - driver, err := util.getPortworxDriver(d.plugin.host, false /*localOnly*/) +func (util *portworxVolumeUtil) DeleteVolume(d *portworxVolumeDeleter) error { + driver, err := util.getPortworxDriver(d.plugin.host) if err != nil || driver == nil { klog.Errorf("Failed to get portworx driver. Err: %v", err) return err @@ -128,8 +128,8 @@ func (util *PortworxVolumeUtil) DeleteVolume(d *portworxVolumeDeleter) error { } // AttachVolume attaches a Portworx Volume -func (util *PortworxVolumeUtil) AttachVolume(m *portworxVolumeMounter, attachOptions map[string]string) (string, error) { - driver, err := util.getPortworxDriver(m.plugin.host, true /*localOnly*/) +func (util *portworxVolumeUtil) AttachVolume(m *portworxVolumeMounter, attachOptions map[string]string) (string, error) { + driver, err := util.getLocalPortworxDriver(m.plugin.host) if err != nil || driver == nil { klog.Errorf("Failed to get portworx driver. Err: %v", err) return "", err @@ -144,8 +144,8 @@ func (util *PortworxVolumeUtil) AttachVolume(m *portworxVolumeMounter, attachOpt } // DetachVolume detaches a Portworx Volume -func (util *PortworxVolumeUtil) DetachVolume(u *portworxVolumeUnmounter) error { - driver, err := util.getPortworxDriver(u.plugin.host, true /*localOnly*/) +func (util *portworxVolumeUtil) DetachVolume(u *portworxVolumeUnmounter) error { + driver, err := util.getLocalPortworxDriver(u.plugin.host) if err != nil || driver == nil { klog.Errorf("Failed to get portworx driver. Err: %v", err) return err @@ -160,8 +160,8 @@ func (util *PortworxVolumeUtil) DetachVolume(u *portworxVolumeUnmounter) error { } // MountVolume mounts a Portworx Volume on the specified mountPath -func (util *PortworxVolumeUtil) MountVolume(m *portworxVolumeMounter, mountPath string) error { - driver, err := util.getPortworxDriver(m.plugin.host, true /*localOnly*/) +func (util *portworxVolumeUtil) MountVolume(m *portworxVolumeMounter, mountPath string) error { + driver, err := util.getLocalPortworxDriver(m.plugin.host) if err != nil || driver == nil { klog.Errorf("Failed to get portworx driver. Err: %v", err) return err @@ -176,8 +176,8 @@ func (util *PortworxVolumeUtil) MountVolume(m *portworxVolumeMounter, mountPath } // UnmountVolume unmounts a Portworx Volume -func (util *PortworxVolumeUtil) UnmountVolume(u *portworxVolumeUnmounter, mountPath string) error { - driver, err := util.getPortworxDriver(u.plugin.host, true /*localOnly*/) +func (util *portworxVolumeUtil) UnmountVolume(u *portworxVolumeUnmounter, mountPath string) error { + driver, err := util.getLocalPortworxDriver(u.plugin.host) if err != nil || driver == nil { klog.Errorf("Failed to get portworx driver. Err: %v", err) return err @@ -191,8 +191,8 @@ func (util *PortworxVolumeUtil) UnmountVolume(u *portworxVolumeUnmounter, mountP return nil } -func (util *PortworxVolumeUtil) ResizeVolume(spec *volume.Spec, newSize resource.Quantity, volumeHost volume.VolumeHost) error { - driver, err := util.getPortworxDriver(volumeHost, false /*localOnly*/) +func (util *portworxVolumeUtil) ResizeVolume(spec *volume.Spec, newSize resource.Quantity, volumeHost volume.VolumeHost) error { + driver, err := util.getPortworxDriver(volumeHost) if err != nil || driver == nil { klog.Errorf("Failed to get portworx driver. Err: %v", err) return err @@ -254,8 +254,8 @@ func isClientValid(client *osdclient.Client) (bool, error) { return true, nil } -func createDriverClient(hostname string) (*osdclient.Client, error) { - client, err := volumeclient.NewDriverClient("http://"+hostname+":"+osdMgmtPort, +func createDriverClient(hostname string, port int32) (*osdclient.Client, error) { + client, err := volumeclient.NewDriverClient(fmt.Sprintf("http://%s:%d", hostname, port), pxdDriverName, osdDriverVersion, pxDriverName) if err != nil { return nil, err @@ -268,65 +268,105 @@ func createDriverClient(hostname string) (*osdclient.Client, error) { } } -// getPortworxDriver() returns a Portworx volume driver which can be used for volume operations -// localOnly: If true, the returned driver will be connected to Portworx API server on volume host. -// If false, driver will be connected to API server on volume host or Portworx k8s service cluster IP -// This flag is required to explicitly force certain operations (mount, unmount, detach, attach) to -// go to the volume host instead of the k8s service which might route it to any host. This pertains to how -// Portworx mounts and attaches a volume to the running container. The node getting these requests needs to -// see the pod container mounts (specifically /var/lib/kubelet/pods/) -// Operations like create and delete volume don't need to be restricted to local volume host since -// any node in the Portworx cluster can co-ordinate the create/delete request and forward the operations to -// the Portworx node that will own/owns the data. -func (util *PortworxVolumeUtil) getPortworxDriver(volumeHost volume.VolumeHost, localOnly bool) (volumeapi.VolumeDriver, error) { - var err error - if localOnly { - util.portworxClient, err = createDriverClient(volumeHost.GetHostName()) - if err != nil { - return nil, err - } else { - klog.V(4).Infof("Using portworx local service at: %v as api endpoint", volumeHost.GetHostName()) - return volumeclient.VolumeDriver(util.portworxClient), nil - } - } - +// getPortworxDriver returns a Portworx volume driver which can be used for cluster wide operations. +// Operations like create and delete volume don't need to be restricted to local volume host since +// any node in the Portworx cluster can co-ordinate the create/delete request and forward the operations to +// the Portworx node that will own/owns the data. +func (util *portworxVolumeUtil) getPortworxDriver(volumeHost volume.VolumeHost) (volumeapi.VolumeDriver, error) { // check if existing saved client is valid if isValid, _ := isClientValid(util.portworxClient); isValid { return volumeclient.VolumeDriver(util.portworxClient), nil } // create new client - util.portworxClient, err = createDriverClient(volumeHost.GetHostName()) // for backward compatibility + var err error + util.portworxClient, err = createDriverClient(volumeHost.GetHostName(), osdMgmtDefaultPort) // for backward compatibility if err != nil || util.portworxClient == nil { - // Create client from portworx service - kubeClient := volumeHost.GetKubeClient() - if kubeClient == nil { - klog.Error("Failed to get kubeclient when creating portworx client") - return nil, nil - } - - opts := metav1.GetOptions{} - svc, err := kubeClient.CoreV1().Services(api.NamespaceSystem).Get(pxServiceName, opts) + // Create client from portworx k8s service. + svc, err := getPortworxService(volumeHost) if err != nil { - klog.Errorf("Failed to get service. Err: %v", err) - return nil, err - } - - if svc == nil { - klog.Errorf("Service: %v not found. Consult Portworx docs to deploy it.", pxServiceName) return nil, err } - util.portworxClient, err = createDriverClient(svc.Spec.ClusterIP) + // The port here is always the default one since it's the service port + util.portworxClient, err = createDriverClient(svc.Spec.ClusterIP, osdMgmtDefaultPort) if err != nil || util.portworxClient == nil { klog.Errorf("Failed to connect to portworx service. Err: %v", err) return nil, err } - klog.Infof("Using portworx cluster service at: %v as api endpoint", svc.Spec.ClusterIP) + klog.Infof("Using portworx cluster service at: %v:%d as api endpoint", + svc.Spec.ClusterIP, osdMgmtDefaultPort) } else { - klog.Infof("Using portworx service at: %v as api endpoint", volumeHost.GetHostName()) + klog.Infof("Using portworx service at: %v:%d as api endpoint", + volumeHost.GetHostName(), osdMgmtDefaultPort) + } + + return volumeclient.VolumeDriver(util.portworxClient), nil +} + +// getLocalPortworxDriver returns driver connected to Portworx API server on volume host. +// This is required to force certain operations (mount, unmount, detach, attach) to +// go to the volume host instead of the k8s service which might route it to any host. This pertains to how +// Portworx mounts and attaches a volume to the running container. The node getting these requests needs to +// see the pod container mounts (specifically /var/lib/kubelet/pods/) +func (util *portworxVolumeUtil) getLocalPortworxDriver(volumeHost volume.VolumeHost) (volumeapi.VolumeDriver, error) { + if util.portworxClient != nil { + // check if existing saved client is valid + if isValid, _ := isClientValid(util.portworxClient); isValid { + return volumeclient.VolumeDriver(util.portworxClient), nil + } + } + + // Lookup port + svc, err := getPortworxService(volumeHost) + if err != nil { + return nil, err + } + + osgMgmtPort := lookupPXAPIPortFromService(svc) + util.portworxClient, err = createDriverClient(volumeHost.GetHostName(), osgMgmtPort) + if err != nil { + return nil, err } + klog.Infof("Using portworx local service at: %v:%d as api endpoint", + volumeHost.GetHostName(), osgMgmtPort) return volumeclient.VolumeDriver(util.portworxClient), nil } + +// lookupPXAPIPortFromService goes over all the ports in the given service and returns the target +// port for osdMgmtDefaultPort +func lookupPXAPIPortFromService(svc *v1.Service) int32 { + for _, p := range svc.Spec.Ports { + if p.Port == osdMgmtDefaultPort { + return p.TargetPort.IntVal + } + } + return osdMgmtDefaultPort // default +} + +// getPortworxService returns the portworx cluster service from the API server +func getPortworxService(host volume.VolumeHost) (*v1.Service, error) { + kubeClient := host.GetKubeClient() + if kubeClient == nil { + err := fmt.Errorf("Failed to get kubeclient when creating portworx client") + klog.Errorf(err.Error()) + return nil, err + } + + opts := metav1.GetOptions{} + svc, err := kubeClient.CoreV1().Services(api.NamespaceSystem).Get(pxServiceName, opts) + if err != nil { + klog.Errorf("Failed to get service. Err: %v", err) + return nil, err + } + + if svc == nil { + err = fmt.Errorf("Service: %v not found. Consult Portworx docs to deploy it.", pxServiceName) + klog.Errorf(err.Error()) + return nil, err + } + + return svc, nil +} diff --git a/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/volume/util/BUILD b/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/volume/util/BUILD index 64eac778de27..8ccd019eb051 100644 --- a/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/volume/util/BUILD +++ b/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/volume/util/BUILD @@ -63,7 +63,6 @@ go_test( "//pkg/apis/core/v1/helper:go_default_library", "//pkg/features:go_default_library", "//pkg/kubelet/apis:go_default_library", - "//pkg/util/mount:go_default_library", "//pkg/util/slice:go_default_library", "//pkg/volume:go_default_library", "//staging/src/k8s.io/api/core/v1:go_default_library", @@ -73,8 +72,12 @@ go_test( "//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library", "//staging/src/k8s.io/apiserver/pkg/util/feature:go_default_library", "//staging/src/k8s.io/apiserver/pkg/util/feature/testing:go_default_library", - "//staging/src/k8s.io/client-go/util/testing:go_default_library", - ], + ] + select({ + "@io_bazel_rules_go//go/platform:linux": [ + "//staging/src/k8s.io/client-go/util/testing:go_default_library", + ], + "//conditions:default": [], + }), ) filegroup( diff --git a/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/volume/util/operationexecutor/operation_executor.go b/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/volume/util/operationexecutor/operation_executor.go index 745910dc220d..cfcc249f8bd1 100644 --- a/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/volume/util/operationexecutor/operation_executor.go +++ b/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/volume/util/operationexecutor/operation_executor.go @@ -725,7 +725,7 @@ func (oe *operationExecutor) MountVolume( if fsVolume { // Filesystem volume case // Mount/remount a volume when a volume is attached - generatedOperations, err = oe.operationGenerator.GenerateMountVolumeFunc( + generatedOperations = oe.operationGenerator.GenerateMountVolumeFunc( waitForAttachTimeout, volumeToMount, actualStateOfWorld, isRemount) } else { diff --git a/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/volume/util/operationexecutor/operation_generator.go b/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/volume/util/operationexecutor/operation_generator.go index 36c10b67752a..e0123d5611a1 100644 --- a/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/volume/util/operationexecutor/operation_generator.go +++ b/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/volume/util/operationexecutor/operation_generator.go @@ -40,6 +40,10 @@ import ( "k8s.io/kubernetes/pkg/volume/util/volumepathhandler" ) +const ( + unknownVolumePlugin string = "UnknownVolumePlugin" +) + var _ OperationGenerator = &operationGenerator{} type operationGenerator struct { @@ -82,7 +86,7 @@ func NewOperationGenerator(kubeClient clientset.Interface, // OperationGenerator interface that extracts out the functions from operation_executor to make it dependency injectable type OperationGenerator interface { // Generates the MountVolume function needed to perform the mount of a volume plugin - GenerateMountVolumeFunc(waitForAttachTimeout time.Duration, volumeToMount VolumeToMount, actualStateOfWorldMounterUpdater ActualStateOfWorldMounterUpdater, isRemount bool) (volumetypes.GeneratedOperations, error) + GenerateMountVolumeFunc(waitForAttachTimeout time.Duration, volumeToMount VolumeToMount, actualStateOfWorldMounterUpdater ActualStateOfWorldMounterUpdater, isRemount bool) volumetypes.GeneratedOperations // Generates the UnmountVolume function needed to perform the unmount of a volume plugin GenerateUnmountVolumeFunc(volumeToUnmount MountedVolume, actualStateOfWorld ActualStateOfWorldMounterUpdater, podsDir string) (volumetypes.GeneratedOperations, error) @@ -436,61 +440,61 @@ func (og *operationGenerator) GenerateMountVolumeFunc( waitForAttachTimeout time.Duration, volumeToMount VolumeToMount, actualStateOfWorld ActualStateOfWorldMounterUpdater, - isRemount bool) (volumetypes.GeneratedOperations, error) { + isRemount bool) volumetypes.GeneratedOperations { // Get mounter plugin + volumePluginName := unknownVolumePlugin volumePlugin, err := og.volumePluginMgr.FindPluginBySpec(volumeToMount.VolumeSpec) - if err != nil || volumePlugin == nil { - return volumetypes.GeneratedOperations{}, volumeToMount.GenerateErrorDetailed("MountVolume.FindPluginBySpec failed", err) + if err == nil && volumePlugin != nil { + volumePluginName = volumePlugin.GetPluginName() } - affinityErr := checkNodeAffinity(og, volumeToMount, volumePlugin) - if affinityErr != nil { - eventErr, detailedErr := volumeToMount.GenerateError("MountVolume.NodeAffinity check failed", affinityErr) - og.recorder.Eventf(volumeToMount.Pod, v1.EventTypeWarning, kevents.FailedMountVolume, eventErr.Error()) - return volumetypes.GeneratedOperations{}, detailedErr - } + mountVolumeFunc := func() (error, error) { + if err != nil || volumePlugin == nil { + return volumeToMount.GenerateError("MountVolume.FindPluginBySpec failed", err) + } - volumeMounter, newMounterErr := volumePlugin.NewMounter( - volumeToMount.VolumeSpec, - volumeToMount.Pod, - volume.VolumeOptions{}) - if newMounterErr != nil { - eventErr, detailedErr := volumeToMount.GenerateError("MountVolume.NewMounter initialization failed", newMounterErr) - og.recorder.Eventf(volumeToMount.Pod, v1.EventTypeWarning, kevents.FailedMountVolume, eventErr.Error()) - return volumetypes.GeneratedOperations{}, detailedErr - } + affinityErr := checkNodeAffinity(og, volumeToMount, volumePlugin) + if affinityErr != nil { + return volumeToMount.GenerateError("MountVolume.NodeAffinity check failed", affinityErr) + } - mountCheckError := checkMountOptionSupport(og, volumeToMount, volumePlugin) + volumeMounter, newMounterErr := volumePlugin.NewMounter( + volumeToMount.VolumeSpec, + volumeToMount.Pod, + volume.VolumeOptions{}) + if newMounterErr != nil { + return volumeToMount.GenerateError("MountVolume.NewMounter initialization failed", newMounterErr) - if mountCheckError != nil { - eventErr, detailedErr := volumeToMount.GenerateError("MountVolume.MountOptionSupport check failed", mountCheckError) - og.recorder.Eventf(volumeToMount.Pod, v1.EventTypeWarning, kevents.UnsupportedMountOption, eventErr.Error()) - return volumetypes.GeneratedOperations{}, detailedErr - } + } - // Get attacher, if possible - attachableVolumePlugin, _ := - og.volumePluginMgr.FindAttachablePluginBySpec(volumeToMount.VolumeSpec) - var volumeAttacher volume.Attacher - if attachableVolumePlugin != nil { - volumeAttacher, _ = attachableVolumePlugin.NewAttacher() - } + mountCheckError := checkMountOptionSupport(og, volumeToMount, volumePlugin) - // get deviceMounter, if possible - deviceMountableVolumePlugin, _ := og.volumePluginMgr.FindDeviceMountablePluginBySpec(volumeToMount.VolumeSpec) - var volumeDeviceMounter volume.DeviceMounter - if deviceMountableVolumePlugin != nil { - volumeDeviceMounter, _ = deviceMountableVolumePlugin.NewDeviceMounter() - } + if mountCheckError != nil { + return volumeToMount.GenerateError("MountVolume.MountOptionSupport check failed", mountCheckError) + } - var fsGroup *int64 - if volumeToMount.Pod.Spec.SecurityContext != nil && - volumeToMount.Pod.Spec.SecurityContext.FSGroup != nil { - fsGroup = volumeToMount.Pod.Spec.SecurityContext.FSGroup - } + // Get attacher, if possible + attachableVolumePlugin, _ := + og.volumePluginMgr.FindAttachablePluginBySpec(volumeToMount.VolumeSpec) + var volumeAttacher volume.Attacher + if attachableVolumePlugin != nil { + volumeAttacher, _ = attachableVolumePlugin.NewAttacher() + } + + // get deviceMounter, if possible + deviceMountableVolumePlugin, _ := og.volumePluginMgr.FindDeviceMountablePluginBySpec(volumeToMount.VolumeSpec) + var volumeDeviceMounter volume.DeviceMounter + if deviceMountableVolumePlugin != nil { + volumeDeviceMounter, _ = deviceMountableVolumePlugin.NewDeviceMounter() + } + + var fsGroup *int64 + if volumeToMount.Pod.Spec.SecurityContext != nil && + volumeToMount.Pod.Spec.SecurityContext.FSGroup != nil { + fsGroup = volumeToMount.Pod.Spec.SecurityContext.FSGroup + } - mountVolumeFunc := func() (error, error) { devicePath := volumeToMount.DevicePath if volumeAttacher != nil { // Wait for attachable volumes to finish attaching @@ -536,7 +540,7 @@ func (og *operationGenerator) GenerateMountVolumeFunc( // resizeFileSystem will resize the file system if user has requested a resize of // underlying persistent volume and is allowed to do so. - resizeSimpleError, resizeDetailedError := og.resizeFileSystem(volumeToMount, devicePath, deviceMountPath, volumePlugin.GetPluginName()) + resizeSimpleError, resizeDetailedError := og.resizeFileSystem(volumeToMount, devicePath, deviceMountPath, volumePluginName) if resizeSimpleError != nil || resizeDetailedError != nil { return resizeSimpleError, resizeDetailedError @@ -593,8 +597,8 @@ func (og *operationGenerator) GenerateMountVolumeFunc( return volumetypes.GeneratedOperations{ OperationFunc: mountVolumeFunc, EventRecorderFunc: eventRecorderFunc, - CompleteFunc: util.OperationCompleteHook(util.GetFullQualifiedPluginNameForVolume(volumePlugin.GetPluginName(), volumeToMount.VolumeSpec), "volume_mount"), - }, nil + CompleteFunc: util.OperationCompleteHook(util.GetFullQualifiedPluginNameForVolume(volumePluginName, volumeToMount.VolumeSpec), "volume_mount"), + } } func (og *operationGenerator) resizeFileSystem(volumeToMount VolumeToMount, devicePath, deviceMountPath, pluginName string) (simpleErr, detailedErr error) { diff --git a/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/volume/util/util.go b/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/volume/util/util.go index 070961c2822a..18e24d69f051 100644 --- a/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/volume/util/util.go +++ b/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/volume/util/util.go @@ -23,9 +23,8 @@ import ( "path" "path/filepath" "strings" - "syscall" - "k8s.io/api/core/v1" + v1 "k8s.io/api/core/v1" storage "k8s.io/api/storage/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/labels" @@ -128,8 +127,9 @@ func SetReady(dir string) { // UnmountPath is a common unmount routine that unmounts the given path and // deletes the remaining directory if successful. +// TODO: Remove this function and change callers to call mount pkg directly func UnmountPath(mountPath string, mounter mount.Interface) error { - return UnmountMountPoint(mountPath, mounter, false /* extensiveMountPointCheck */) + return mount.CleanupMountPoint(mountPath, mounter, false /* extensiveMountPointCheck */) } // UnmountMountPoint is a common unmount routine that unmounts the given path and @@ -137,93 +137,21 @@ func UnmountPath(mountPath string, mounter mount.Interface) error { // if extensiveMountPointCheck is true // IsNotMountPoint will be called instead of IsLikelyNotMountPoint. // IsNotMountPoint is more expensive but properly handles bind mounts. +// TODO: Change callers to call mount pkg directly func UnmountMountPoint(mountPath string, mounter mount.Interface, extensiveMountPointCheck bool) error { - pathExists, pathErr := PathExists(mountPath) - if !pathExists { - klog.Warningf("Warning: Unmount skipped because path does not exist: %v", mountPath) - return nil - } - corruptedMnt := IsCorruptedMnt(pathErr) - if pathErr != nil && !corruptedMnt { - return fmt.Errorf("Error checking path: %v", pathErr) - } - return doUnmountMountPoint(mountPath, mounter, extensiveMountPointCheck, corruptedMnt) -} - -// doUnmountMountPoint is a common unmount routine that unmounts the given path and -// deletes the remaining directory if successful. -// if extensiveMountPointCheck is true -// IsNotMountPoint will be called instead of IsLikelyNotMountPoint. -// IsNotMountPoint is more expensive but properly handles bind mounts. -// if corruptedMnt is true, it means that the mountPath is a corrupted mountpoint, Take it as an argument for convenience of testing -func doUnmountMountPoint(mountPath string, mounter mount.Interface, extensiveMountPointCheck bool, corruptedMnt bool) error { - if !corruptedMnt { - var notMnt bool - var err error - if extensiveMountPointCheck { - notMnt, err = mount.IsNotMountPoint(mounter, mountPath) - } else { - notMnt, err = mounter.IsLikelyNotMountPoint(mountPath) - } - - if err != nil { - return err - } - - if notMnt { - klog.Warningf("Warning: %q is not a mountpoint, deleting", mountPath) - return os.Remove(mountPath) - } - } - - // Unmount the mount path - klog.V(4).Infof("%q is a mountpoint, unmounting", mountPath) - if err := mounter.Unmount(mountPath); err != nil { - return err - } - notMnt, mntErr := mounter.IsLikelyNotMountPoint(mountPath) - if mntErr != nil { - return mntErr - } - if notMnt { - klog.V(4).Infof("%q is unmounted, deleting the directory", mountPath) - return os.Remove(mountPath) - } - return fmt.Errorf("Failed to unmount path %v", mountPath) + return mount.CleanupMountPoint(mountPath, mounter, extensiveMountPointCheck) } // PathExists returns true if the specified path exists. +// TODO: Change callers to call mount pkg directly func PathExists(path string) (bool, error) { - _, err := os.Stat(path) - if err == nil { - return true, nil - } else if os.IsNotExist(err) { - return false, nil - } else if IsCorruptedMnt(err) { - return true, err - } else { - return false, err - } + return mount.PathExists(path) } // IsCorruptedMnt return true if err is about corrupted mount point +// TODO: Change callers to call mount pkg directly func IsCorruptedMnt(err error) bool { - if err == nil { - return false - } - var underlyingError error - switch pe := err.(type) { - case nil: - return false - case *os.PathError: - underlyingError = pe.Err - case *os.LinkError: - underlyingError = pe.Err - case *os.SyscallError: - underlyingError = pe.Err - } - - return underlyingError == syscall.ENOTCONN || underlyingError == syscall.ESTALE || underlyingError == syscall.EIO + return mount.IsCorruptedMnt(err) } // GetSecretForPod locates secret by name in the pod's namespace and returns secret map @@ -825,9 +753,10 @@ func GetUniqueVolumeName(pluginName, volumeName string) v1.UniqueVolumeName { return v1.UniqueVolumeName(fmt.Sprintf("%s/%s", pluginName, volumeName)) } -// GetUniqueVolumeNameForNonAttachableVolume returns the unique volume name -// for a non-attachable volume. -func GetUniqueVolumeNameForNonAttachableVolume( +// GetUniqueVolumeNameFromSpecWithPod returns a unique volume name with pod +// name included. This is useful to generate different names for different pods +// on same volume. +func GetUniqueVolumeNameFromSpecWithPod( podName types.UniquePodName, volumePlugin volume.VolumePlugin, volumeSpec *volume.Spec) v1.UniqueVolumeName { return v1.UniqueVolumeName( fmt.Sprintf("%s/%v-%s", volumePlugin.GetPluginName(), podName, volumeSpec.Name()))