Update deps

This commit is contained in:
Jeff Mitchell 2017-02-02 16:19:55 -05:00
parent 1fa4c6232f
commit 5e20429298
95 changed files with 2212 additions and 1268 deletions

View File

@ -5,4 +5,4 @@ package aws
const SDKName = "aws-sdk-go"
// SDKVersion is the version of this SDK
const SDKVersion = "1.6.17"
const SDKVersion = "1.6.18"

View File

@ -122,7 +122,7 @@ func (c *DynamoDB) BatchGetItemRequest(input *BatchGetItemInput) (req *request.R
// API operation BatchGetItem for usage and error information.
//
// Returned Error Codes:
// * ProvisionedThroughputExceededException
// * ErrCodeProvisionedThroughputExceededException "ProvisionedThroughputExceededException"
// Your request rate is too high. The AWS SDKs for DynamoDB automatically retry
// requests that receive this exception. Your request is eventually successful,
// unless your retry queue is too large to finish. Reduce the frequency of requests
@ -130,11 +130,11 @@ func (c *DynamoDB) BatchGetItemRequest(input *BatchGetItemInput) (req *request.R
// Exponential Backoff (http://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Programming.Errors.html#Programming.Errors.RetryAndBackoff)
// in the Amazon DynamoDB Developer Guide.
//
// * ResourceNotFoundException
// * ErrCodeResourceNotFoundException "ResourceNotFoundException"
// The operation tried to access a nonexistent table or index. The resource
// might not be specified correctly, or its status might not be ACTIVE.
//
// * InternalServerError
// * ErrCodeInternalServerError "InternalServerError"
// An error occurred on the server side.
//
// Please also see https://docs.aws.amazon.com/goto/WebAPI/dynamodb-2012-08-10/BatchGetItem
@ -292,7 +292,7 @@ func (c *DynamoDB) BatchWriteItemRequest(input *BatchWriteItemInput) (req *reque
// API operation BatchWriteItem for usage and error information.
//
// Returned Error Codes:
// * ProvisionedThroughputExceededException
// * ErrCodeProvisionedThroughputExceededException "ProvisionedThroughputExceededException"
// Your request rate is too high. The AWS SDKs for DynamoDB automatically retry
// requests that receive this exception. Your request is eventually successful,
// unless your retry queue is too large to finish. Reduce the frequency of requests
@ -300,15 +300,15 @@ func (c *DynamoDB) BatchWriteItemRequest(input *BatchWriteItemInput) (req *reque
// Exponential Backoff (http://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Programming.Errors.html#Programming.Errors.RetryAndBackoff)
// in the Amazon DynamoDB Developer Guide.
//
// * ResourceNotFoundException
// * ErrCodeResourceNotFoundException "ResourceNotFoundException"
// The operation tried to access a nonexistent table or index. The resource
// might not be specified correctly, or its status might not be ACTIVE.
//
// * ItemCollectionSizeLimitExceededException
// * ErrCodeItemCollectionSizeLimitExceededException "ItemCollectionSizeLimitExceededException"
// An item collection is too large. This exception is only returned for tables
// that have one or more local secondary indexes.
//
// * InternalServerError
// * ErrCodeInternalServerError "InternalServerError"
// An error occurred on the server side.
//
// Please also see https://docs.aws.amazon.com/goto/WebAPI/dynamodb-2012-08-10/BatchWriteItem
@ -387,12 +387,12 @@ func (c *DynamoDB) CreateTableRequest(input *CreateTableInput) (req *request.Req
// API operation CreateTable for usage and error information.
//
// Returned Error Codes:
// * ResourceInUseException
// * ErrCodeResourceInUseException "ResourceInUseException"
// The operation conflicts with the resource's availability. For example, you
// attempted to recreate an existing table, or tried to delete a table currently
// in the CREATING state.
//
// * LimitExceededException
// * ErrCodeLimitExceededException "LimitExceededException"
// The number of concurrent table requests (cumulative number of tables in the
// CREATING, DELETING or UPDATING state) exceeds the maximum allowed of 10.
//
@ -402,7 +402,7 @@ func (c *DynamoDB) CreateTableRequest(input *CreateTableInput) (req *request.Req
//
// The total limit of tables in the ACTIVE state is 250.
//
// * InternalServerError
// * ErrCodeInternalServerError "InternalServerError"
// An error occurred on the server side.
//
// Please also see https://docs.aws.amazon.com/goto/WebAPI/dynamodb-2012-08-10/CreateTable
@ -480,10 +480,10 @@ func (c *DynamoDB) DeleteItemRequest(input *DeleteItemInput) (req *request.Reque
// API operation DeleteItem for usage and error information.
//
// Returned Error Codes:
// * ConditionalCheckFailedException
// * ErrCodeConditionalCheckFailedException "ConditionalCheckFailedException"
// A condition specified in the operation could not be evaluated.
//
// * ProvisionedThroughputExceededException
// * ErrCodeProvisionedThroughputExceededException "ProvisionedThroughputExceededException"
// Your request rate is too high. The AWS SDKs for DynamoDB automatically retry
// requests that receive this exception. Your request is eventually successful,
// unless your retry queue is too large to finish. Reduce the frequency of requests
@ -491,15 +491,15 @@ func (c *DynamoDB) DeleteItemRequest(input *DeleteItemInput) (req *request.Reque
// Exponential Backoff (http://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Programming.Errors.html#Programming.Errors.RetryAndBackoff)
// in the Amazon DynamoDB Developer Guide.
//
// * ResourceNotFoundException
// * ErrCodeResourceNotFoundException "ResourceNotFoundException"
// The operation tried to access a nonexistent table or index. The resource
// might not be specified correctly, or its status might not be ACTIVE.
//
// * ItemCollectionSizeLimitExceededException
// * ErrCodeItemCollectionSizeLimitExceededException "ItemCollectionSizeLimitExceededException"
// An item collection is too large. This exception is only returned for tables
// that have one or more local secondary indexes.
//
// * InternalServerError
// * ErrCodeInternalServerError "InternalServerError"
// An error occurred on the server side.
//
// Please also see https://docs.aws.amazon.com/goto/WebAPI/dynamodb-2012-08-10/DeleteItem
@ -581,16 +581,16 @@ func (c *DynamoDB) DeleteTableRequest(input *DeleteTableInput) (req *request.Req
// API operation DeleteTable for usage and error information.
//
// Returned Error Codes:
// * ResourceInUseException
// * ErrCodeResourceInUseException "ResourceInUseException"
// The operation conflicts with the resource's availability. For example, you
// attempted to recreate an existing table, or tried to delete a table currently
// in the CREATING state.
//
// * ResourceNotFoundException
// * ErrCodeResourceNotFoundException "ResourceNotFoundException"
// The operation tried to access a nonexistent table or index. The resource
// might not be specified correctly, or its status might not be ACTIVE.
//
// * LimitExceededException
// * ErrCodeLimitExceededException "LimitExceededException"
// The number of concurrent table requests (cumulative number of tables in the
// CREATING, DELETING or UPDATING state) exceeds the maximum allowed of 10.
//
@ -600,7 +600,7 @@ func (c *DynamoDB) DeleteTableRequest(input *DeleteTableInput) (req *request.Req
//
// The total limit of tables in the ACTIVE state is 250.
//
// * InternalServerError
// * ErrCodeInternalServerError "InternalServerError"
// An error occurred on the server side.
//
// Please also see https://docs.aws.amazon.com/goto/WebAPI/dynamodb-2012-08-10/DeleteTable
@ -721,7 +721,7 @@ func (c *DynamoDB) DescribeLimitsRequest(input *DescribeLimitsInput) (req *reque
// API operation DescribeLimits for usage and error information.
//
// Returned Error Codes:
// * InternalServerError
// * ErrCodeInternalServerError "InternalServerError"
// An error occurred on the server side.
//
// Please also see https://docs.aws.amazon.com/goto/WebAPI/dynamodb-2012-08-10/DescribeLimits
@ -794,11 +794,11 @@ func (c *DynamoDB) DescribeTableRequest(input *DescribeTableInput) (req *request
// API operation DescribeTable for usage and error information.
//
// Returned Error Codes:
// * ResourceNotFoundException
// * ErrCodeResourceNotFoundException "ResourceNotFoundException"
// The operation tried to access a nonexistent table or index. The resource
// might not be specified correctly, or its status might not be ACTIVE.
//
// * InternalServerError
// * ErrCodeInternalServerError "InternalServerError"
// An error occurred on the server side.
//
// Please also see https://docs.aws.amazon.com/goto/WebAPI/dynamodb-2012-08-10/DescribeTable
@ -870,7 +870,7 @@ func (c *DynamoDB) GetItemRequest(input *GetItemInput) (req *request.Request, ou
// API operation GetItem for usage and error information.
//
// Returned Error Codes:
// * ProvisionedThroughputExceededException
// * ErrCodeProvisionedThroughputExceededException "ProvisionedThroughputExceededException"
// Your request rate is too high. The AWS SDKs for DynamoDB automatically retry
// requests that receive this exception. Your request is eventually successful,
// unless your retry queue is too large to finish. Reduce the frequency of requests
@ -878,11 +878,11 @@ func (c *DynamoDB) GetItemRequest(input *GetItemInput) (req *request.Request, ou
// Exponential Backoff (http://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Programming.Errors.html#Programming.Errors.RetryAndBackoff)
// in the Amazon DynamoDB Developer Guide.
//
// * ResourceNotFoundException
// * ErrCodeResourceNotFoundException "ResourceNotFoundException"
// The operation tried to access a nonexistent table or index. The resource
// might not be specified correctly, or its status might not be ACTIVE.
//
// * InternalServerError
// * ErrCodeInternalServerError "InternalServerError"
// An error occurred on the server side.
//
// Please also see https://docs.aws.amazon.com/goto/WebAPI/dynamodb-2012-08-10/GetItem
@ -955,7 +955,7 @@ func (c *DynamoDB) ListTablesRequest(input *ListTablesInput) (req *request.Reque
// API operation ListTables for usage and error information.
//
// Returned Error Codes:
// * InternalServerError
// * ErrCodeInternalServerError "InternalServerError"
// An error occurred on the server side.
//
// Please also see https://docs.aws.amazon.com/goto/WebAPI/dynamodb-2012-08-10/ListTables
@ -1049,11 +1049,11 @@ func (c *DynamoDB) ListTagsOfResourceRequest(input *ListTagsOfResourceInput) (re
// API operation ListTagsOfResource for usage and error information.
//
// Returned Error Codes:
// * ResourceNotFoundException
// * ErrCodeResourceNotFoundException "ResourceNotFoundException"
// The operation tried to access a nonexistent table or index. The resource
// might not be specified correctly, or its status might not be ACTIVE.
//
// * InternalServerError
// * ErrCodeInternalServerError "InternalServerError"
// An error occurred on the server side.
//
// Please also see https://docs.aws.amazon.com/goto/WebAPI/dynamodb-2012-08-10/ListTagsOfResource
@ -1140,10 +1140,10 @@ func (c *DynamoDB) PutItemRequest(input *PutItemInput) (req *request.Request, ou
// API operation PutItem for usage and error information.
//
// Returned Error Codes:
// * ConditionalCheckFailedException
// * ErrCodeConditionalCheckFailedException "ConditionalCheckFailedException"
// A condition specified in the operation could not be evaluated.
//
// * ProvisionedThroughputExceededException
// * ErrCodeProvisionedThroughputExceededException "ProvisionedThroughputExceededException"
// Your request rate is too high. The AWS SDKs for DynamoDB automatically retry
// requests that receive this exception. Your request is eventually successful,
// unless your retry queue is too large to finish. Reduce the frequency of requests
@ -1151,15 +1151,15 @@ func (c *DynamoDB) PutItemRequest(input *PutItemInput) (req *request.Request, ou
// Exponential Backoff (http://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Programming.Errors.html#Programming.Errors.RetryAndBackoff)
// in the Amazon DynamoDB Developer Guide.
//
// * ResourceNotFoundException
// * ErrCodeResourceNotFoundException "ResourceNotFoundException"
// The operation tried to access a nonexistent table or index. The resource
// might not be specified correctly, or its status might not be ACTIVE.
//
// * ItemCollectionSizeLimitExceededException
// * ErrCodeItemCollectionSizeLimitExceededException "ItemCollectionSizeLimitExceededException"
// An item collection is too large. This exception is only returned for tables
// that have one or more local secondary indexes.
//
// * InternalServerError
// * ErrCodeInternalServerError "InternalServerError"
// An error occurred on the server side.
//
// Please also see https://docs.aws.amazon.com/goto/WebAPI/dynamodb-2012-08-10/PutItem
@ -1255,7 +1255,7 @@ func (c *DynamoDB) QueryRequest(input *QueryInput) (req *request.Request, output
// API operation Query for usage and error information.
//
// Returned Error Codes:
// * ProvisionedThroughputExceededException
// * ErrCodeProvisionedThroughputExceededException "ProvisionedThroughputExceededException"
// Your request rate is too high. The AWS SDKs for DynamoDB automatically retry
// requests that receive this exception. Your request is eventually successful,
// unless your retry queue is too large to finish. Reduce the frequency of requests
@ -1263,11 +1263,11 @@ func (c *DynamoDB) QueryRequest(input *QueryInput) (req *request.Request, output
// Exponential Backoff (http://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Programming.Errors.html#Programming.Errors.RetryAndBackoff)
// in the Amazon DynamoDB Developer Guide.
//
// * ResourceNotFoundException
// * ErrCodeResourceNotFoundException "ResourceNotFoundException"
// The operation tried to access a nonexistent table or index. The resource
// might not be specified correctly, or its status might not be ACTIVE.
//
// * InternalServerError
// * ErrCodeInternalServerError "InternalServerError"
// An error occurred on the server side.
//
// Please also see https://docs.aws.amazon.com/goto/WebAPI/dynamodb-2012-08-10/Query
@ -1383,7 +1383,7 @@ func (c *DynamoDB) ScanRequest(input *ScanInput) (req *request.Request, output *
// API operation Scan for usage and error information.
//
// Returned Error Codes:
// * ProvisionedThroughputExceededException
// * ErrCodeProvisionedThroughputExceededException "ProvisionedThroughputExceededException"
// Your request rate is too high. The AWS SDKs for DynamoDB automatically retry
// requests that receive this exception. Your request is eventually successful,
// unless your retry queue is too large to finish. Reduce the frequency of requests
@ -1391,11 +1391,11 @@ func (c *DynamoDB) ScanRequest(input *ScanInput) (req *request.Request, output *
// Exponential Backoff (http://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Programming.Errors.html#Programming.Errors.RetryAndBackoff)
// in the Amazon DynamoDB Developer Guide.
//
// * ResourceNotFoundException
// * ErrCodeResourceNotFoundException "ResourceNotFoundException"
// The operation tried to access a nonexistent table or index. The resource
// might not be specified correctly, or its status might not be ACTIVE.
//
// * InternalServerError
// * ErrCodeInternalServerError "InternalServerError"
// An error occurred on the server side.
//
// Please also see https://docs.aws.amazon.com/goto/WebAPI/dynamodb-2012-08-10/Scan
@ -1493,7 +1493,7 @@ func (c *DynamoDB) TagResourceRequest(input *TagResourceInput) (req *request.Req
// API operation TagResource for usage and error information.
//
// Returned Error Codes:
// * LimitExceededException
// * ErrCodeLimitExceededException "LimitExceededException"
// The number of concurrent table requests (cumulative number of tables in the
// CREATING, DELETING or UPDATING state) exceeds the maximum allowed of 10.
//
@ -1503,14 +1503,14 @@ func (c *DynamoDB) TagResourceRequest(input *TagResourceInput) (req *request.Req
//
// The total limit of tables in the ACTIVE state is 250.
//
// * ResourceNotFoundException
// * ErrCodeResourceNotFoundException "ResourceNotFoundException"
// The operation tried to access a nonexistent table or index. The resource
// might not be specified correctly, or its status might not be ACTIVE.
//
// * InternalServerError
// * ErrCodeInternalServerError "InternalServerError"
// An error occurred on the server side.
//
// * ResourceInUseException
// * ErrCodeResourceInUseException "ResourceInUseException"
// The operation conflicts with the resource's availability. For example, you
// attempted to recreate an existing table, or tried to delete a table currently
// in the CREATING state.
@ -1583,7 +1583,7 @@ func (c *DynamoDB) UntagResourceRequest(input *UntagResourceInput) (req *request
// API operation UntagResource for usage and error information.
//
// Returned Error Codes:
// * LimitExceededException
// * ErrCodeLimitExceededException "LimitExceededException"
// The number of concurrent table requests (cumulative number of tables in the
// CREATING, DELETING or UPDATING state) exceeds the maximum allowed of 10.
//
@ -1593,14 +1593,14 @@ func (c *DynamoDB) UntagResourceRequest(input *UntagResourceInput) (req *request
//
// The total limit of tables in the ACTIVE state is 250.
//
// * ResourceNotFoundException
// * ErrCodeResourceNotFoundException "ResourceNotFoundException"
// The operation tried to access a nonexistent table or index. The resource
// might not be specified correctly, or its status might not be ACTIVE.
//
// * InternalServerError
// * ErrCodeInternalServerError "InternalServerError"
// An error occurred on the server side.
//
// * ResourceInUseException
// * ErrCodeResourceInUseException "ResourceInUseException"
// The operation conflicts with the resource's availability. For example, you
// attempted to recreate an existing table, or tried to delete a table currently
// in the CREATING state.
@ -1674,10 +1674,10 @@ func (c *DynamoDB) UpdateItemRequest(input *UpdateItemInput) (req *request.Reque
// API operation UpdateItem for usage and error information.
//
// Returned Error Codes:
// * ConditionalCheckFailedException
// * ErrCodeConditionalCheckFailedException "ConditionalCheckFailedException"
// A condition specified in the operation could not be evaluated.
//
// * ProvisionedThroughputExceededException
// * ErrCodeProvisionedThroughputExceededException "ProvisionedThroughputExceededException"
// Your request rate is too high. The AWS SDKs for DynamoDB automatically retry
// requests that receive this exception. Your request is eventually successful,
// unless your retry queue is too large to finish. Reduce the frequency of requests
@ -1685,15 +1685,15 @@ func (c *DynamoDB) UpdateItemRequest(input *UpdateItemInput) (req *request.Reque
// Exponential Backoff (http://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Programming.Errors.html#Programming.Errors.RetryAndBackoff)
// in the Amazon DynamoDB Developer Guide.
//
// * ResourceNotFoundException
// * ErrCodeResourceNotFoundException "ResourceNotFoundException"
// The operation tried to access a nonexistent table or index. The resource
// might not be specified correctly, or its status might not be ACTIVE.
//
// * ItemCollectionSizeLimitExceededException
// * ErrCodeItemCollectionSizeLimitExceededException "ItemCollectionSizeLimitExceededException"
// An item collection is too large. This exception is only returned for tables
// that have one or more local secondary indexes.
//
// * InternalServerError
// * ErrCodeInternalServerError "InternalServerError"
// An error occurred on the server side.
//
// Please also see https://docs.aws.amazon.com/goto/WebAPI/dynamodb-2012-08-10/UpdateItem
@ -1775,16 +1775,16 @@ func (c *DynamoDB) UpdateTableRequest(input *UpdateTableInput) (req *request.Req
// API operation UpdateTable for usage and error information.
//
// Returned Error Codes:
// * ResourceInUseException
// * ErrCodeResourceInUseException "ResourceInUseException"
// The operation conflicts with the resource's availability. For example, you
// attempted to recreate an existing table, or tried to delete a table currently
// in the CREATING state.
//
// * ResourceNotFoundException
// * ErrCodeResourceNotFoundException "ResourceNotFoundException"
// The operation tried to access a nonexistent table or index. The resource
// might not be specified correctly, or its status might not be ACTIVE.
//
// * LimitExceededException
// * ErrCodeLimitExceededException "LimitExceededException"
// The number of concurrent table requests (cumulative number of tables in the
// CREATING, DELETING or UPDATING state) exceeds the maximum allowed of 10.
//
@ -1794,7 +1794,7 @@ func (c *DynamoDB) UpdateTableRequest(input *UpdateTableInput) (req *request.Req
//
// The total limit of tables in the ACTIVE state is 250.
//
// * InternalServerError
// * ErrCodeInternalServerError "InternalServerError"
// An error occurred on the server side.
//
// Please also see https://docs.aws.amazon.com/goto/WebAPI/dynamodb-2012-08-10/UpdateTable

View File

@ -0,0 +1,64 @@
// THIS FILE IS AUTOMATICALLY GENERATED. DO NOT EDIT.
package dynamodb
const (
// ErrCodeConditionalCheckFailedException for service response error code
// "ConditionalCheckFailedException".
//
// A condition specified in the operation could not be evaluated.
ErrCodeConditionalCheckFailedException = "ConditionalCheckFailedException"
// ErrCodeInternalServerError for service response error code
// "InternalServerError".
//
// An error occurred on the server side.
ErrCodeInternalServerError = "InternalServerError"
// ErrCodeItemCollectionSizeLimitExceededException for service response error code
// "ItemCollectionSizeLimitExceededException".
//
// An item collection is too large. This exception is only returned for tables
// that have one or more local secondary indexes.
ErrCodeItemCollectionSizeLimitExceededException = "ItemCollectionSizeLimitExceededException"
// ErrCodeLimitExceededException for service response error code
// "LimitExceededException".
//
// The number of concurrent table requests (cumulative number of tables in the
// CREATING, DELETING or UPDATING state) exceeds the maximum allowed of 10.
//
// Also, for tables with secondary indexes, only one of those tables can be
// in the CREATING state at any point in time. Do not attempt to create more
// than one such table simultaneously.
//
// The total limit of tables in the ACTIVE state is 250.
ErrCodeLimitExceededException = "LimitExceededException"
// ErrCodeProvisionedThroughputExceededException for service response error code
// "ProvisionedThroughputExceededException".
//
// Your request rate is too high. The AWS SDKs for DynamoDB automatically retry
// requests that receive this exception. Your request is eventually successful,
// unless your retry queue is too large to finish. Reduce the frequency of requests
// and use exponential backoff. For more information, go to Error Retries and
// Exponential Backoff (http://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Programming.Errors.html#Programming.Errors.RetryAndBackoff)
// in the Amazon DynamoDB Developer Guide.
ErrCodeProvisionedThroughputExceededException = "ProvisionedThroughputExceededException"
// ErrCodeResourceInUseException for service response error code
// "ResourceInUseException".
//
// The operation conflicts with the resource's availability. For example, you
// attempted to recreate an existing table, or tried to delete a table currently
// in the CREATING state.
ErrCodeResourceInUseException = "ResourceInUseException"
// ErrCodeResourceNotFoundException for service response error code
// "ResourceNotFoundException".
//
// The operation tried to access a nonexistent table or index. The resource
// might not be specified correctly, or its status might not be ACTIVE.
ErrCodeResourceNotFoundException = "ResourceNotFoundException"
)

View File

@ -15504,6 +15504,11 @@ func (s *AccountAttributeValue) SetAttributeValue(v string) *AccountAttributeVal
type ActiveInstance struct {
_ struct{} `type:"structure"`
// The health status of the instance. If the status of both the instance status
// check and the system status check is impaired, the health status of the instance
// is unhealthy. Otherwise, the health status is healthy.
InstanceHealth *string `locationName:"instanceHealth" type:"string" enum:"InstanceHealthStatus"`
// The ID of the instance.
InstanceId *string `locationName:"instanceId" type:"string"`
@ -15524,6 +15529,12 @@ func (s ActiveInstance) GoString() string {
return s.String()
}
// SetInstanceHealth sets the InstanceHealth field's value.
func (s *ActiveInstance) SetInstanceHealth(v string) *ActiveInstance {
s.InstanceHealth = &v
return s
}
// SetInstanceId sets the InstanceId field's value.
func (s *ActiveInstance) SetInstanceId(v string) *ActiveInstance {
s.InstanceId = &v
@ -48233,6 +48244,9 @@ type SpotFleetRequestConfigData struct {
// LaunchSpecifications is a required field
LaunchSpecifications []*SpotFleetLaunchSpecification `locationName:"launchSpecifications" locationNameList:"item" min:"1" type:"list" required:"true"`
// Indicates whether Spot fleet should replace unhealthy instances.
ReplaceUnhealthyInstances *bool `locationName:"replaceUnhealthyInstances" type:"boolean"`
// The bid price per unit hour.
//
// SpotPrice is a required field
@ -48350,6 +48364,12 @@ func (s *SpotFleetRequestConfigData) SetLaunchSpecifications(v []*SpotFleetLaunc
return s
}
// SetReplaceUnhealthyInstances sets the ReplaceUnhealthyInstances field's value.
func (s *SpotFleetRequestConfigData) SetReplaceUnhealthyInstances(v bool) *SpotFleetRequestConfigData {
s.ReplaceUnhealthyInstances = &v
return s
}
// SetSpotPrice sets the SpotPrice field's value.
func (s *SpotFleetRequestConfigData) SetSpotPrice(v string) *SpotFleetRequestConfigData {
s.SpotPrice = &v
@ -51943,6 +51963,14 @@ const (
InstanceAttributeNameEnaSupport = "enaSupport"
)
const (
// InstanceHealthStatusHealthy is a InstanceHealthStatus enum value
InstanceHealthStatusHealthy = "healthy"
// InstanceHealthStatusUnhealthy is a InstanceHealthStatus enum value
InstanceHealthStatusUnhealthy = "unhealthy"
)
const (
// InstanceLifecycleTypeSpot is a InstanceLifecycleType enum value
InstanceLifecycleTypeSpot = "spot"

View File

@ -0,0 +1,3 @@
// THIS FILE IS AUTOMATICALLY GENERATED. DO NOT EDIT.
package ec2

File diff suppressed because it is too large Load Diff

169
vendor/github.com/aws/aws-sdk-go/service/iam/errors.go generated vendored Normal file
View File

@ -0,0 +1,169 @@
// THIS FILE IS AUTOMATICALLY GENERATED. DO NOT EDIT.
package iam
const (
// ErrCodeCredentialReportExpiredException for service response error code
// "ReportExpired".
//
// The request was rejected because the most recent credential report has expired.
// To generate a new credential report, use GenerateCredentialReport. For more
// information about credential report expiration, see Getting Credential Reports
// (http://docs.aws.amazon.com/IAM/latest/UserGuide/credential-reports.html)
// in the IAM User Guide.
ErrCodeCredentialReportExpiredException = "ReportExpired"
// ErrCodeCredentialReportNotPresentException for service response error code
// "ReportNotPresent".
//
// The request was rejected because the credential report does not exist. To
// generate a credential report, use GenerateCredentialReport.
ErrCodeCredentialReportNotPresentException = "ReportNotPresent"
// ErrCodeCredentialReportNotReadyException for service response error code
// "ReportInProgress".
//
// The request was rejected because the credential report is still being generated.
ErrCodeCredentialReportNotReadyException = "ReportInProgress"
// ErrCodeDeleteConflictException for service response error code
// "DeleteConflict".
//
// The request was rejected because it attempted to delete a resource that has
// attached subordinate entities. The error message describes these entities.
ErrCodeDeleteConflictException = "DeleteConflict"
// ErrCodeDuplicateCertificateException for service response error code
// "DuplicateCertificate".
//
// The request was rejected because the same certificate is associated with
// an IAM user in the account.
ErrCodeDuplicateCertificateException = "DuplicateCertificate"
// ErrCodeDuplicateSSHPublicKeyException for service response error code
// "DuplicateSSHPublicKey".
//
// The request was rejected because the SSH public key is already associated
// with the specified IAM user.
ErrCodeDuplicateSSHPublicKeyException = "DuplicateSSHPublicKey"
// ErrCodeEntityAlreadyExistsException for service response error code
// "EntityAlreadyExists".
//
// The request was rejected because it attempted to create a resource that already
// exists.
ErrCodeEntityAlreadyExistsException = "EntityAlreadyExists"
// ErrCodeEntityTemporarilyUnmodifiableException for service response error code
// "EntityTemporarilyUnmodifiable".
//
// The request was rejected because it referenced an entity that is temporarily
// unmodifiable, such as a user name that was deleted and then recreated. The
// error indicates that the request is likely to succeed if you try again after
// waiting several minutes. The error message describes the entity.
ErrCodeEntityTemporarilyUnmodifiableException = "EntityTemporarilyUnmodifiable"
// ErrCodeInvalidAuthenticationCodeException for service response error code
// "InvalidAuthenticationCode".
//
// The request was rejected because the authentication code was not recognized.
// The error message describes the specific error.
ErrCodeInvalidAuthenticationCodeException = "InvalidAuthenticationCode"
// ErrCodeInvalidCertificateException for service response error code
// "InvalidCertificate".
//
// The request was rejected because the certificate is invalid.
ErrCodeInvalidCertificateException = "InvalidCertificate"
// ErrCodeInvalidInputException for service response error code
// "InvalidInput".
//
// The request was rejected because an invalid or out-of-range value was supplied
// for an input parameter.
ErrCodeInvalidInputException = "InvalidInput"
// ErrCodeInvalidPublicKeyException for service response error code
// "InvalidPublicKey".
//
// The request was rejected because the public key is malformed or otherwise
// invalid.
ErrCodeInvalidPublicKeyException = "InvalidPublicKey"
// ErrCodeInvalidUserTypeException for service response error code
// "InvalidUserType".
//
// The request was rejected because the type of user for the transaction was
// incorrect.
ErrCodeInvalidUserTypeException = "InvalidUserType"
// ErrCodeKeyPairMismatchException for service response error code
// "KeyPairMismatch".
//
// The request was rejected because the public key certificate and the private
// key do not match.
ErrCodeKeyPairMismatchException = "KeyPairMismatch"
// ErrCodeLimitExceededException for service response error code
// "LimitExceeded".
//
// The request was rejected because it attempted to create resources beyond
// the current AWS account limits. The error message describes the limit exceeded.
ErrCodeLimitExceededException = "LimitExceeded"
// ErrCodeMalformedCertificateException for service response error code
// "MalformedCertificate".
//
// The request was rejected because the certificate was malformed or expired.
// The error message describes the specific error.
ErrCodeMalformedCertificateException = "MalformedCertificate"
// ErrCodeMalformedPolicyDocumentException for service response error code
// "MalformedPolicyDocument".
//
// The request was rejected because the policy document was malformed. The error
// message describes the specific error.
ErrCodeMalformedPolicyDocumentException = "MalformedPolicyDocument"
// ErrCodeNoSuchEntityException for service response error code
// "NoSuchEntity".
//
// The request was rejected because it referenced an entity that does not exist.
// The error message describes the entity.
ErrCodeNoSuchEntityException = "NoSuchEntity"
// ErrCodePasswordPolicyViolationException for service response error code
// "PasswordPolicyViolation".
//
// The request was rejected because the provided password did not meet the requirements
// imposed by the account password policy.
ErrCodePasswordPolicyViolationException = "PasswordPolicyViolation"
// ErrCodePolicyEvaluationException for service response error code
// "PolicyEvaluation".
//
// The request failed because a provided policy could not be successfully evaluated.
// An additional detail message indicates the source of the failure.
ErrCodePolicyEvaluationException = "PolicyEvaluation"
// ErrCodeServiceFailureException for service response error code
// "ServiceFailure".
//
// The request processing has failed because of an unknown error, exception
// or failure.
ErrCodeServiceFailureException = "ServiceFailure"
// ErrCodeServiceNotSupportedException for service response error code
// "NotSupportedService".
//
// The specified service does not support service-specific credentials.
ErrCodeServiceNotSupportedException = "NotSupportedService"
// ErrCodeUnrecognizedPublicKeyEncodingException for service response error code
// "UnrecognizedPublicKeyEncoding".
//
// The request was rejected because the public key encoding format is unsupported
// or unrecognized.
ErrCodeUnrecognizedPublicKeyEncodingException = "UnrecognizedPublicKeyEncoding"
)

View File

@ -73,7 +73,7 @@ func (c *S3) AbortMultipartUploadRequest(input *AbortMultipartUploadInput) (req
// API operation AbortMultipartUpload for usage and error information.
//
// Returned Error Codes:
// * NoSuchUpload
// * ErrCodeNoSuchUpload "NoSuchUpload"
// The specified multipart upload does not exist.
//
// Please also see https://docs.aws.amazon.com/goto/WebAPI/s3-2006-03-01/AbortMultipartUpload
@ -198,7 +198,7 @@ func (c *S3) CopyObjectRequest(input *CopyObjectInput) (req *request.Request, ou
// API operation CopyObject for usage and error information.
//
// Returned Error Codes:
// * ObjectNotInActiveTierError
// * ErrCodeObjectNotInActiveTierError "ObjectNotInActiveTierError"
// The source object of the COPY operation is not in the active tier and is
// only stored in Amazon Glacier.
//
@ -264,11 +264,11 @@ func (c *S3) CreateBucketRequest(input *CreateBucketInput) (req *request.Request
// API operation CreateBucket for usage and error information.
//
// Returned Error Codes:
// * BucketAlreadyExists
// * ErrCodeBucketAlreadyExists "BucketAlreadyExists"
// The requested bucket name is not available. The bucket namespace is shared
// by all users of the system. Please select a different name and try again.
//
// * BucketAlreadyOwnedByYou
// * ErrCodeBucketAlreadyOwnedByYou "BucketAlreadyOwnedByYou"
//
// Please also see https://docs.aws.amazon.com/goto/WebAPI/s3-2006-03-01/CreateBucket
@ -2296,7 +2296,7 @@ func (c *S3) GetObjectRequest(input *GetObjectInput) (req *request.Request, outp
// API operation GetObject for usage and error information.
//
// Returned Error Codes:
// * NoSuchKey
// * ErrCodeNoSuchKey "NoSuchKey"
// The specified key does not exist.
//
// Please also see https://docs.aws.amazon.com/goto/WebAPI/s3-2006-03-01/GetObject
@ -2361,7 +2361,7 @@ func (c *S3) GetObjectAclRequest(input *GetObjectAclInput) (req *request.Request
// API operation GetObjectAcl for usage and error information.
//
// Returned Error Codes:
// * NoSuchKey
// * ErrCodeNoSuchKey "NoSuchKey"
// The specified key does not exist.
//
// Please also see https://docs.aws.amazon.com/goto/WebAPI/s3-2006-03-01/GetObjectAcl
@ -2549,7 +2549,7 @@ func (c *S3) HeadBucketRequest(input *HeadBucketInput) (req *request.Request, ou
// API operation HeadBucket for usage and error information.
//
// Returned Error Codes:
// * NoSuchBucket
// * ErrCodeNoSuchBucket "NoSuchBucket"
// The specified bucket does not exist.
//
// Please also see https://docs.aws.amazon.com/goto/WebAPI/s3-2006-03-01/HeadBucket
@ -2616,7 +2616,7 @@ func (c *S3) HeadObjectRequest(input *HeadObjectInput) (req *request.Request, ou
// API operation HeadObject for usage and error information.
//
// Returned Error Codes:
// * NoSuchKey
// * ErrCodeNoSuchKey "NoSuchKey"
// The specified key does not exist.
//
// Please also see https://docs.aws.amazon.com/goto/WebAPI/s3-2006-03-01/HeadObject
@ -3111,7 +3111,7 @@ func (c *S3) ListObjectsRequest(input *ListObjectsInput) (req *request.Request,
// API operation ListObjects for usage and error information.
//
// Returned Error Codes:
// * NoSuchBucket
// * ErrCodeNoSuchBucket "NoSuchBucket"
// The specified bucket does not exist.
//
// Please also see https://docs.aws.amazon.com/goto/WebAPI/s3-2006-03-01/ListObjects
@ -3210,7 +3210,7 @@ func (c *S3) ListObjectsV2Request(input *ListObjectsV2Input) (req *request.Reque
// API operation ListObjectsV2 for usage and error information.
//
// Returned Error Codes:
// * NoSuchBucket
// * ErrCodeNoSuchBucket "NoSuchBucket"
// The specified bucket does not exist.
//
// Please also see https://docs.aws.amazon.com/goto/WebAPI/s3-2006-03-01/ListObjectsV2
@ -4525,7 +4525,7 @@ func (c *S3) PutObjectAclRequest(input *PutObjectAclInput) (req *request.Request
// API operation PutObjectAcl for usage and error information.
//
// Returned Error Codes:
// * NoSuchKey
// * ErrCodeNoSuchKey "NoSuchKey"
// The specified key does not exist.
//
// Please also see https://docs.aws.amazon.com/goto/WebAPI/s3-2006-03-01/PutObjectAcl
@ -4650,7 +4650,7 @@ func (c *S3) RestoreObjectRequest(input *RestoreObjectInput) (req *request.Reque
// API operation RestoreObject for usage and error information.
//
// Returned Error Codes:
// * ObjectAlreadyInActiveTierError
// * ErrCodeObjectAlreadyInActiveTierError "ObjectAlreadyInActiveTierError"
// This operation is not allowed against this storage tier
//
// Please also see https://docs.aws.amazon.com/goto/WebAPI/s3-2006-03-01/RestoreObject

48
vendor/github.com/aws/aws-sdk-go/service/s3/errors.go generated vendored Normal file
View File

@ -0,0 +1,48 @@
// THIS FILE IS AUTOMATICALLY GENERATED. DO NOT EDIT.
package s3
const (
// ErrCodeBucketAlreadyExists for service response error code
// "BucketAlreadyExists".
//
// The requested bucket name is not available. The bucket namespace is shared
// by all users of the system. Please select a different name and try again.
ErrCodeBucketAlreadyExists = "BucketAlreadyExists"
// ErrCodeBucketAlreadyOwnedByYou for service response error code
// "BucketAlreadyOwnedByYou".
ErrCodeBucketAlreadyOwnedByYou = "BucketAlreadyOwnedByYou"
// ErrCodeNoSuchBucket for service response error code
// "NoSuchBucket".
//
// The specified bucket does not exist.
ErrCodeNoSuchBucket = "NoSuchBucket"
// ErrCodeNoSuchKey for service response error code
// "NoSuchKey".
//
// The specified key does not exist.
ErrCodeNoSuchKey = "NoSuchKey"
// ErrCodeNoSuchUpload for service response error code
// "NoSuchUpload".
//
// The specified multipart upload does not exist.
ErrCodeNoSuchUpload = "NoSuchUpload"
// ErrCodeObjectAlreadyInActiveTierError for service response error code
// "ObjectAlreadyInActiveTierError".
//
// This operation is not allowed against this storage tier
ErrCodeObjectAlreadyInActiveTierError = "ObjectAlreadyInActiveTierError"
// ErrCodeObjectNotInActiveTierError for service response error code
// "ObjectNotInActiveTierError".
//
// The source object of the COPY operation is not in the active tier and is
// only stored in Amazon Glacier.
ErrCodeObjectNotInActiveTierError = "ObjectNotInActiveTierError"
)

View File

@ -153,16 +153,16 @@ func (c *STS) AssumeRoleRequest(input *AssumeRoleInput) (req *request.Request, o
// API operation AssumeRole for usage and error information.
//
// Returned Error Codes:
// * MalformedPolicyDocument
// * ErrCodeMalformedPolicyDocumentException "MalformedPolicyDocument"
// The request was rejected because the policy document was malformed. The error
// message describes the specific error.
//
// * PackedPolicyTooLarge
// * ErrCodePackedPolicyTooLargeException "PackedPolicyTooLarge"
// The request was rejected because the policy document was too large. The error
// message describes how big the policy document is, in packed form, as a percentage
// of what the API allows.
//
// * RegionDisabledException
// * ErrCodeRegionDisabledException "RegionDisabledException"
// STS is not activated in the requested region for the account that is being
// asked to generate credentials. The account administrator must use the IAM
// console to activate STS in that region. For more information, see Activating
@ -297,31 +297,31 @@ func (c *STS) AssumeRoleWithSAMLRequest(input *AssumeRoleWithSAMLInput) (req *re
// API operation AssumeRoleWithSAML for usage and error information.
//
// Returned Error Codes:
// * MalformedPolicyDocument
// * ErrCodeMalformedPolicyDocumentException "MalformedPolicyDocument"
// The request was rejected because the policy document was malformed. The error
// message describes the specific error.
//
// * PackedPolicyTooLarge
// * ErrCodePackedPolicyTooLargeException "PackedPolicyTooLarge"
// The request was rejected because the policy document was too large. The error
// message describes how big the policy document is, in packed form, as a percentage
// of what the API allows.
//
// * IDPRejectedClaim
// * ErrCodeIDPRejectedClaimException "IDPRejectedClaim"
// The identity provider (IdP) reported that authentication failed. This might
// be because the claim is invalid.
//
// If this error is returned for the AssumeRoleWithWebIdentity operation, it
// can also mean that the claim has expired or has been explicitly revoked.
//
// * InvalidIdentityToken
// * ErrCodeInvalidIdentityTokenException "InvalidIdentityToken"
// The web identity token that was passed could not be validated by AWS. Get
// a new identity token from the identity provider and then retry the request.
//
// * ExpiredTokenException
// * ErrCodeExpiredTokenException "ExpiredTokenException"
// The web identity token that was passed is expired or is not valid. Get a
// new identity token from the identity provider and then retry the request.
//
// * RegionDisabledException
// * ErrCodeRegionDisabledException "RegionDisabledException"
// STS is not activated in the requested region for the account that is being
// asked to generate credentials. The account administrator must use the IAM
// console to activate STS in that region. For more information, see Activating
@ -478,38 +478,38 @@ func (c *STS) AssumeRoleWithWebIdentityRequest(input *AssumeRoleWithWebIdentityI
// API operation AssumeRoleWithWebIdentity for usage and error information.
//
// Returned Error Codes:
// * MalformedPolicyDocument
// * ErrCodeMalformedPolicyDocumentException "MalformedPolicyDocument"
// The request was rejected because the policy document was malformed. The error
// message describes the specific error.
//
// * PackedPolicyTooLarge
// * ErrCodePackedPolicyTooLargeException "PackedPolicyTooLarge"
// The request was rejected because the policy document was too large. The error
// message describes how big the policy document is, in packed form, as a percentage
// of what the API allows.
//
// * IDPRejectedClaim
// * ErrCodeIDPRejectedClaimException "IDPRejectedClaim"
// The identity provider (IdP) reported that authentication failed. This might
// be because the claim is invalid.
//
// If this error is returned for the AssumeRoleWithWebIdentity operation, it
// can also mean that the claim has expired or has been explicitly revoked.
//
// * IDPCommunicationError
// * ErrCodeIDPCommunicationErrorException "IDPCommunicationError"
// The request could not be fulfilled because the non-AWS identity provider
// (IDP) that was asked to verify the incoming identity token could not be reached.
// This is often a transient error caused by network conditions. Retry the request
// a limited number of times so that you don't exceed the request rate. If the
// error persists, the non-AWS identity provider might be down or not responding.
//
// * InvalidIdentityToken
// * ErrCodeInvalidIdentityTokenException "InvalidIdentityToken"
// The web identity token that was passed could not be validated by AWS. Get
// a new identity token from the identity provider and then retry the request.
//
// * ExpiredTokenException
// * ErrCodeExpiredTokenException "ExpiredTokenException"
// The web identity token that was passed is expired or is not valid. Get a
// new identity token from the identity provider and then retry the request.
//
// * RegionDisabledException
// * ErrCodeRegionDisabledException "RegionDisabledException"
// STS is not activated in the requested region for the account that is being
// asked to generate credentials. The account administrator must use the IAM
// console to activate STS in that region. For more information, see Activating
@ -609,7 +609,7 @@ func (c *STS) DecodeAuthorizationMessageRequest(input *DecodeAuthorizationMessag
// API operation DecodeAuthorizationMessage for usage and error information.
//
// Returned Error Codes:
// * InvalidAuthorizationMessageException
// * ErrCodeInvalidAuthorizationMessageException "InvalidAuthorizationMessageException"
// The error returned if the message passed to DecodeAuthorizationMessage was
// invalid. This can happen if the token contains invalid characters, such as
// linebreaks.
@ -814,16 +814,16 @@ func (c *STS) GetFederationTokenRequest(input *GetFederationTokenInput) (req *re
// API operation GetFederationToken for usage and error information.
//
// Returned Error Codes:
// * MalformedPolicyDocument
// * ErrCodeMalformedPolicyDocumentException "MalformedPolicyDocument"
// The request was rejected because the policy document was malformed. The error
// message describes the specific error.
//
// * PackedPolicyTooLarge
// * ErrCodePackedPolicyTooLargeException "PackedPolicyTooLarge"
// The request was rejected because the policy document was too large. The error
// message describes how big the policy document is, in packed form, as a percentage
// of what the API allows.
//
// * RegionDisabledException
// * ErrCodeRegionDisabledException "RegionDisabledException"
// STS is not activated in the requested region for the account that is being
// asked to generate credentials. The account administrator must use the IAM
// console to activate STS in that region. For more information, see Activating
@ -937,7 +937,7 @@ func (c *STS) GetSessionTokenRequest(input *GetSessionTokenInput) (req *request.
// API operation GetSessionToken for usage and error information.
//
// Returned Error Codes:
// * RegionDisabledException
// * ErrCodeRegionDisabledException "RegionDisabledException"
// STS is not activated in the requested region for the account that is being
// asked to generate credentials. The account administrator must use the IAM
// console to activate STS in that region. For more information, see Activating

73
vendor/github.com/aws/aws-sdk-go/service/sts/errors.go generated vendored Normal file
View File

@ -0,0 +1,73 @@
// THIS FILE IS AUTOMATICALLY GENERATED. DO NOT EDIT.
package sts
const (
// ErrCodeExpiredTokenException for service response error code
// "ExpiredTokenException".
//
// The web identity token that was passed is expired or is not valid. Get a
// new identity token from the identity provider and then retry the request.
ErrCodeExpiredTokenException = "ExpiredTokenException"
// ErrCodeIDPCommunicationErrorException for service response error code
// "IDPCommunicationError".
//
// The request could not be fulfilled because the non-AWS identity provider
// (IDP) that was asked to verify the incoming identity token could not be reached.
// This is often a transient error caused by network conditions. Retry the request
// a limited number of times so that you don't exceed the request rate. If the
// error persists, the non-AWS identity provider might be down or not responding.
ErrCodeIDPCommunicationErrorException = "IDPCommunicationError"
// ErrCodeIDPRejectedClaimException for service response error code
// "IDPRejectedClaim".
//
// The identity provider (IdP) reported that authentication failed. This might
// be because the claim is invalid.
//
// If this error is returned for the AssumeRoleWithWebIdentity operation, it
// can also mean that the claim has expired or has been explicitly revoked.
ErrCodeIDPRejectedClaimException = "IDPRejectedClaim"
// ErrCodeInvalidAuthorizationMessageException for service response error code
// "InvalidAuthorizationMessageException".
//
// The error returned if the message passed to DecodeAuthorizationMessage was
// invalid. This can happen if the token contains invalid characters, such as
// linebreaks.
ErrCodeInvalidAuthorizationMessageException = "InvalidAuthorizationMessageException"
// ErrCodeInvalidIdentityTokenException for service response error code
// "InvalidIdentityToken".
//
// The web identity token that was passed could not be validated by AWS. Get
// a new identity token from the identity provider and then retry the request.
ErrCodeInvalidIdentityTokenException = "InvalidIdentityToken"
// ErrCodeMalformedPolicyDocumentException for service response error code
// "MalformedPolicyDocument".
//
// The request was rejected because the policy document was malformed. The error
// message describes the specific error.
ErrCodeMalformedPolicyDocumentException = "MalformedPolicyDocument"
// ErrCodePackedPolicyTooLargeException for service response error code
// "PackedPolicyTooLarge".
//
// The request was rejected because the policy document was too large. The error
// message describes how big the policy document is, in packed form, as a percentage
// of what the API allows.
ErrCodePackedPolicyTooLargeException = "PackedPolicyTooLarge"
// ErrCodeRegionDisabledException for service response error code
// "RegionDisabledException".
//
// STS is not activated in the requested region for the account that is being
// asked to generate credentials. The account administrator must use the IAM
// console to activate STS in that region. For more information, see Activating
// and Deactivating AWS STS in an AWS Region (http://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_temp_enable-regions.html)
// in the IAM User Guide.
ErrCodeRegionDisabledException = "RegionDisabledException"
)

View File

@ -124,7 +124,7 @@ func main() {
cmc.CheckManager.API.URL = os.Getenv("CIRCONUS_API_URL")
// Check configuration options
cmc.CheckManager.Check.SubmissionURL = os.Getenv("CIRCONUS_SUBMISION_URL")
cmc.CheckManager.Check.SubmissionURL = os.Getenv("CIRCONUS_SUBMISSION_URL")
cmc.CheckManager.Check.ID = os.Getenv("CIRCONUS_CHECK_ID")
cmc.CheckManager.Check.InstanceID = ""
cmc.CheckManager.Check.DisplayName = ""

View File

@ -48,19 +48,19 @@ type GraphComposite struct {
// GraphDatapoint defines a datapoint
type GraphDatapoint struct {
Alpha string `json:"alpha,omitempty"` // string
Axis string `json:"axis,omitempty"` // string
CAQL *string `json:"caql,omitempty"` // string or null
CheckID uint `json:"check_id,omitempty"` // uint
Color string `json:"color,omitempty"` // string
DataFormula *string `json:"data_formula,omitempty"` // string or null
Derive interface{} `json:"derive,omitempty"` // BUG doc: string, api: string or boolean(for caql statements)
Hidden bool `json:"hidden,omitempty"` // boolean
LegendFormula *string `json:"legend_formula,omitempty"` // string or null
MetricName string `json:"metric_name,omitempty"` // string
MetricType string `json:"metric_type,omitempty"` // string
Name string `json:"name,omitempty"` // string
Stack *uint `json:"stack,omitempty"` // uint or null
Alpha *float64 `json:"alpha,string,omitempty"` // float64
Axis string `json:"axis,omitempty"` // string
CAQL *string `json:"caql,omitempty"` // string or null
CheckID uint `json:"check_id,omitempty"` // uint
Color *string `json:"color,omitempty"` // string
DataFormula *string `json:"data_formula"` // string or null
Derive interface{} `json:"derive,omitempty"` // BUG doc: string, api: string or boolean(for caql statements)
Hidden bool `json:"hidden"` // boolean
LegendFormula *string `json:"legend_formula"` // string or null
MetricName string `json:"metric_name,omitempty"` // string
MetricType string `json:"metric_type,omitempty"` // string
Name string `json:"name"` // string
Stack *uint `json:"stack"` // uint or null
}
// GraphGuide defines a guide
@ -74,47 +74,47 @@ type GraphGuide struct {
// GraphMetricCluster defines a metric cluster
type GraphMetricCluster struct {
AggregateFunc string `json:"aggregation_function,omitempty"` // string
Axis string `json:"axis,omitempty"` // string
DataFormula *string `json:"data_formula,omitempty"` // string or null
Hidden bool `json:"hidden,omitempty"` // boolean
LegendFormula *string `json:"legend_formula,omitempty"` // string or null
MetricCluster string `json:"metric_cluster,omitempty"` // string
Name string `json:"name,omitempty"` // string
Stack *uint `json:"stack,omitempty"` // uint or null
AggregateFunc string `json:"aggregate_function,omitempty"` // string
Axis string `json:"axis,omitempty"` // string
DataFormula *string `json:"data_formula"` // string or null
Hidden bool `json:"hidden"` // boolean
LegendFormula *string `json:"legend_formula"` // string or null
MetricCluster string `json:"metric_cluster,omitempty"` // string
Name string `json:"name,omitempty"` // string
Stack *uint `json:"stack"` // uint or null
}
// OverlayDataOptions defines overlay options for data. Note, each overlay type requires
// a _subset_ of the options. See Graph API documentation (URL above) for details.
type OverlayDataOptions struct {
Alerts string `json:"alerts,omitempty"` // string BUG doc: numeric, api: string
ArrayOutput string `json:"array_output,omitempty"` // string BUG doc: numeric, api: string
BasePeriod string `json:"base_period,omitempty"` // string BUG doc: numeric, api: string
Delay string `json:"delay,omitempty"` // string BUG doc: numeric, api: string
Extension string `json:"extension,omitempty"` // string
GraphTitle string `json:"graph_title,omitempty"` // string
GraphUUID string `json:"graph_id,omitempty"` // string
InPercent string `json:"in_percent,omitempty"` // string BUG doc: boolean, api: string
Inverse string `json:"inverse,omitempty"` // string BUG doc: numeric, api: string
Method string `json:"method,omitempty"` // string
Model string `json:"model,omitempty"` // string
ModelEnd string `json:"model_end,omitempty"` // string
ModelPeriod string `json:"model_period,omitempty"` // string
ModelRelative string `json:"model_relative,omitempty"` // string BUG doc: numeric, api: string
Out string `json:"out,omitempty"` // string
Prequel string `json:"prequel,omitempty"` // string
Presets string `json:"presets,omitempty"` // string
Quantiles string `json:"quantiles,omitempty"` // string
SeasonLength string `json:"season_length,omitempty"` // string BUG doc: numeric, api: string
Sensitivity string `json:"sensitivity,omitempty"` // string BUG doc: numeric, api: string
SingleValue string `json:"single_value,omitempty"` // string BUG doc: numeric, api: string
TargetPeriod string `json:"target_period,omitempty"` // string
TimeOffset string `json:"time_offset,omitempty"` // string
TimeShift string `json:"time_shift,omitempty"` // string BUG doc: numeric, api: string
Transform string `json:"transform,omitempty"` // string
Version string `json:"version,omitempty"` // string BUG doc: numeric, api: string
Window string `json:"window,omitempty"` // string BUG doc: numeric, api: string
XShift string `json:"x_shift,omitempty"` // string
Alerts *int `json:"alerts,string,omitempty"` // int encoded as string BUG doc: numeric, api: string
ArrayOutput *int `json:"array_output,string,omitempty"` // int encoded as string BUG doc: numeric, api: string
BasePeriod *int `json:"base_period,string,omitempty"` // int encoded as string BUG doc: numeric, api: string
Delay *int `json:"delay,string,omitempty"` // int encoded as string BUG doc: numeric, api: string
Extension string `json:"extension,omitempty"` // string
GraphTitle string `json:"graph_title,omitempty"` // string
GraphUUID string `json:"graph_id,omitempty"` // string
InPercent *bool `json:"in_percent,string,omitempty"` // boolean encoded as string BUG doc: boolean, api: string
Inverse *int `json:"inverse,string,omitempty"` // int encoded as string BUG doc: numeric, api: string
Method string `json:"method,omitempty"` // string
Model string `json:"model,omitempty"` // string
ModelEnd string `json:"model_end,omitempty"` // string
ModelPeriod string `json:"model_period,omitempty"` // string
ModelRelative *int `json:"model_relative,string,omitempty"` // int encoded as string BUG doc: numeric, api: string
Out string `json:"out,omitempty"` // string
Prequel string `json:"prequel,omitempty"` // string
Presets string `json:"presets,omitempty"` // string
Quantiles string `json:"quantiles,omitempty"` // string
SeasonLength *int `json:"season_length,string,omitempty"` // int encoded as string BUG doc: numeric, api: string
Sensitivity *int `json:"sensitivity,string,omitempty"` // int encoded as string BUG doc: numeric, api: string
SingleValue *int `json:"single_value,string,omitempty"` // int encoded as string BUG doc: numeric, api: string
TargetPeriod string `json:"target_period,omitempty"` // string
TimeOffset string `json:"time_offset,omitempty"` // string
TimeShift *int `json:"time_shift,string,omitempty"` // int encoded as string BUG doc: numeric, api: string
Transform string `json:"transform,omitempty"` // string
Version *int `json:"version,string,omitempty"` // int encoded as string BUG doc: numeric, api: string
Window *int `json:"window,string,omitempty"` // int encoded as string BUG doc: numeric, api: string
XShift string `json:"x_shift,omitempty"` // string
}
// OverlayUISpecs defines UI specs for overlay
@ -123,7 +123,7 @@ type OverlayUISpecs struct {
ID string `json:"id,omitempty"` // string
Label string `json:"label,omitempty"` // string
Type string `json:"type,omitempty"` // string
Z string `json:"z,omitempty"` // string BUG doc: numeric, api: string
Z *int `json:"z,string,omitempty"` // int encoded as string BUG doc: numeric, api: string
}
// GraphOverlaySet defines overlays for graph
@ -136,25 +136,25 @@ type GraphOverlaySet struct {
// Graph defines a graph. See https://login.circonus.com/resources/api/calls/graph for more information.
type Graph struct {
AccessKeys []GraphAccessKey `json:"access_keys,omitempty"` // [] len >= 0
CID string `json:"_cid,omitempty"` // string
Composites []GraphComposite `json:"composites,omitempty"` // [] len >= 0
Datapoints []GraphDatapoint `json:"datapoints,omitempt"` // [] len >= 0
Description string `json:"description,omitempty"` // string
Guides []GraphGuide `json:"guides,omitempty"` // [] len >= 0
LineStyle string `json:"line_style,omitempty"` // string
LogLeftY int `json:"logarithmitc_left_y,omitempty"` // string or null BUG doc: number (not string)
LogRightY int `json:"logarithmitc_right_y,omitempty"` // string or null BUG doc: number (not string)
MaxLeftY *string `json:"max_left_y,omitempty"` // string or null BUG doc: number (not string)
MaxRightY *string `json:"max_right_y,omitempty"` // string or null BUG doc: number (not string)
MetricClusters []GraphMetricCluster `json:"metric_clusters,omitempty"` // [] len >= 0
MinLeftY *string `json:"min_left_y,omitempty"` // string or null BUG doc: number (not string)
MinRightY *string `json:"min_right_y,omitempty"` // string or null BUG doc: number (not string)
Notes *string `json:"notes,omitempty"` // string or null
OverlaySets *map[string]GraphOverlaySet `json:"overlay_sets,omitempty"` // GroupOverLaySets or null
Style string `json:"style,omitempty"` // string
Tags []string `json:"tags,omitempty"` // [] len >= 0
Title string `json:"title,omitempty"` // string
AccessKeys []GraphAccessKey `json:"access_keys,omitempty"` // [] len >= 0
CID string `json:"_cid,omitempty"` // string
Composites []GraphComposite `json:"composites,omitempty"` // [] len >= 0
Datapoints []GraphDatapoint `json:"datapoints,omitempt"` // [] len >= 0
Description string `json:"description,omitempty"` // string
Guides []GraphGuide `json:"guides,omitempty"` // [] len >= 0
LineStyle *string `json:"line_style"` // string or null
LogLeftY *int `json:"logarithmic_left_y,string,omitempty"` // int encoded as string or null BUG doc: number (not string)
LogRightY *int `json:"logarithmic_right_y,string,omitempty"` // int encoded as string or null BUG doc: number (not string)
MaxLeftY *float64 `json:"max_left_y,string,omitempty"` // float64 encoded as string or null BUG doc: number (not string)
MaxRightY *float64 `json:"max_right_y,string,omitempty"` // float64 encoded as string or null BUG doc: number (not string)
MetricClusters []GraphMetricCluster `json:"metric_clusters,omitempty"` // [] len >= 0
MinLeftY *float64 `json:"min_left_y,string,omitempty"` // float64 encoded as string or null BUG doc: number (not string)
MinRightY *float64 `json:"min_right_y,string,omitempty"` // float64 encoded as string or null BUG doc: number (not string)
Notes *string `json:"notes,omitempty"` // string or null
OverlaySets *map[string]GraphOverlaySet `json:"overlay_sets,omitempty"` // GroupOverLaySets or null
Style *string `json:"style"` // string or null
Tags []string `json:"tags,omitempty"` // [] len >= 0
Title string `json:"title,omitempty"` // string
}
// NewGraph returns a Graph (with defaults, if applicable)

View File

@ -187,34 +187,30 @@ func (cm *CheckManager) isValidBroker(broker *api.Broker) bool {
brokerHost = *detail.IP
}
// broker must be reachable and respond within designated time
conn, err := net.DialTimeout("tcp", fmt.Sprintf("%s:%s", brokerHost, brokerPort), cm.brokerMaxResponseTime)
if err != nil {
if detail.CN != "trap.noit.circonus.net" {
if cm.Debug {
cm.Log.Printf("[DEBUG] Broker '%s' unable to connect, %v\n", broker.Name, err)
}
continue // not able to reach the broker (or respone slow enough for it to be considered not usable)
}
// if circonus trap broker, try port 443
if brokerHost == "trap.noit.circonus.net" && brokerPort != "443" {
brokerPort = "443"
conn, err = net.DialTimeout("tcp", fmt.Sprintf("%s:%s", detail.CN, brokerPort), cm.brokerMaxResponseTime)
if err != nil {
if cm.Debug {
cm.Log.Printf("[DEBUG] Broker '%s' unable to connect %v\n", broker.Name, err)
}
continue // not able to reach the broker on 443 either (or respone slow enough for it to be considered not usable)
}
retries := 5
for attempt := 1; attempt <= retries; attempt++ {
// broker must be reachable and respond within designated time
conn, err := net.DialTimeout("tcp", fmt.Sprintf("%s:%s", brokerHost, brokerPort), cm.brokerMaxResponseTime)
if err == nil {
conn.Close()
valid = true
break
}
}
conn.Close()
if cm.Debug {
cm.Log.Printf("[DEBUG] Broker '%s' is valid\n", broker.Name)
cm.Log.Printf("[WARN] Broker '%s' unable to connect, %v. Retrying in 2 seconds, attempt %d of %d.", broker.Name, err, attempt, retries)
time.Sleep(2 * time.Second)
}
valid = true
break
if valid {
if cm.Debug {
cm.Log.Printf("[DEBUG] Broker '%s' is valid\n", broker.Name)
}
break
}
}
return valid
}

View File

@ -126,7 +126,7 @@ func New(cfg *Config) (*CirconusMetrics, error) {
cm.Debug = cfg.Debug
cm.Log = cfg.Log
if cm.Debug && cfg.Log == nil {
if cm.Debug && cm.Log == nil {
cm.Log = log.New(os.Stderr, "", log.LstdFlags)
}
if cm.Log == nil {
@ -219,6 +219,11 @@ func (m *CirconusMetrics) Start() {
return
}
// Ready returns true or false indicating if the check is ready to accept metrics
func (m *CirconusMetrics) Ready() bool {
return m.check.IsReady()
}
// Flush metrics kicks off the process of sending metrics to Circonus
func (m *CirconusMetrics) Flush() {
if m.flushing {

View File

@ -41,11 +41,14 @@ func NewSession(client *v3.Client, opts ...SessionOption) (*Session, error) {
opt(ops)
}
resp, err := client.Grant(ops.ctx, int64(ops.ttl))
if err != nil {
return nil, err
id := ops.leaseID
if id == v3.NoLease {
resp, err := client.Grant(ops.ctx, int64(ops.ttl))
if err != nil {
return nil, err
}
id = v3.LeaseID(resp.ID)
}
id := v3.LeaseID(resp.ID)
ctx, cancel := context.WithCancel(ops.ctx)
keepAlive, err := client.KeepAlive(ctx, id)
@ -98,8 +101,9 @@ func (s *Session) Close() error {
}
type sessionOptions struct {
ttl int
ctx context.Context
ttl int
leaseID v3.LeaseID
ctx context.Context
}
// SessionOption configures Session.
@ -115,6 +119,15 @@ func WithTTL(ttl int) SessionOption {
}
}
// WithLease specifies the existing leaseID to be used for the session.
// This is useful in process restart scenario, for example, to reclaim
// leadership from an election prior to restart.
func WithLease(leaseID v3.LeaseID) SessionOption {
return func(so *sessionOptions) {
so.leaseID = leaseID
}
}
// WithContext assigns a context to the session instead of defaulting to
// using the client context. This is useful for canceling NewSession and
// Close operations immediately without having to close the client. If the

View File

@ -1,5 +1,15 @@
.PHONY: default install build test quicktest fmt vet lint
GO_VERSION := $(shell go version | cut -d' ' -f3 | cut -d. -f2)
# Only use the `-race` flag on newer versions of Go
IS_OLD_GO := $(shell test $(GO_VERSION) -le 2 && echo true)
ifeq ($(IS_OLD_GO),true)
RACE_FLAG :=
else
RACE_FLAG := -race
endif
default: fmt vet lint build quicktest
install:
@ -9,7 +19,7 @@ build:
go build -v ./...
test:
go test -v -cover ./...
go test -v $(RACE_FLAG) -cover ./...
quicktest:
go test ./...

13
vendor/github.com/go-ldap/ldap/atomic_value.go generated vendored Normal file
View File

@ -0,0 +1,13 @@
// +build go1.4
package ldap
import (
"sync/atomic"
)
// For compilers that support it, we just use the underlying sync/atomic.Value
// type.
type atomicValue struct {
atomic.Value
}

28
vendor/github.com/go-ldap/ldap/atomic_value_go13.go generated vendored Normal file
View File

@ -0,0 +1,28 @@
// +build !go1.4
package ldap
import (
"sync"
)
// This is a helper type that emulates the use of the "sync/atomic.Value"
// struct that's available in Go 1.4 and up.
type atomicValue struct {
value interface{}
lock sync.RWMutex
}
func (av *atomicValue) Store(val interface{}) {
av.lock.Lock()
av.value = val
av.lock.Unlock()
}
func (av *atomicValue) Load() interface{} {
av.lock.RLock()
ret := av.value
av.lock.RUnlock()
return ret
}

View File

@ -11,6 +11,7 @@ import (
"log"
"net"
"sync"
"sync/atomic"
"time"
"gopkg.in/asn1-ber.v1"
@ -82,8 +83,8 @@ const (
type Conn struct {
conn net.Conn
isTLS bool
isClosing bool
closeErr error
closeCount uint32
closeErr atomicValue
isStartingTLS bool
Debug debugging
chanConfirm chan bool
@ -158,10 +159,20 @@ func (l *Conn) Start() {
l.wgClose.Add(1)
}
// isClosing returns whether or not we're currently closing.
func (l *Conn) isClosing() bool {
return atomic.LoadUint32(&l.closeCount) > 0
}
// setClosing sets the closing value to true
func (l *Conn) setClosing() {
atomic.AddUint32(&l.closeCount, 1)
}
// Close closes the connection.
func (l *Conn) Close() {
l.once.Do(func() {
l.isClosing = true
l.setClosing()
l.wgSender.Wait()
l.Debug.Printf("Sending quit message and waiting for confirmation")
@ -258,7 +269,7 @@ func (l *Conn) sendMessage(packet *ber.Packet) (*messageContext, error) {
}
func (l *Conn) sendMessageWithFlags(packet *ber.Packet, flags sendMessageFlags) (*messageContext, error) {
if l.isClosing {
if l.isClosing() {
return nil, NewError(ErrorNetwork, errors.New("ldap: connection closed"))
}
l.messageMutex.Lock()
@ -297,7 +308,7 @@ func (l *Conn) sendMessageWithFlags(packet *ber.Packet, flags sendMessageFlags)
func (l *Conn) finishMessage(msgCtx *messageContext) {
close(msgCtx.done)
if l.isClosing {
if l.isClosing() {
return
}
@ -316,7 +327,7 @@ func (l *Conn) finishMessage(msgCtx *messageContext) {
}
func (l *Conn) sendProcessMessage(message *messagePacket) bool {
if l.isClosing {
if l.isClosing() {
return false
}
l.wgSender.Add(1)
@ -333,8 +344,8 @@ func (l *Conn) processMessages() {
for messageID, msgCtx := range l.messageContexts {
// If we are closing due to an error, inform anyone who
// is waiting about the error.
if l.isClosing && l.closeErr != nil {
msgCtx.sendResponse(&PacketResponse{Error: l.closeErr})
if l.isClosing() && l.closeErr.Load() != nil {
msgCtx.sendResponse(&PacketResponse{Error: l.closeErr.Load().(error)})
}
l.Debug.Printf("Closing channel for MessageID %d", messageID)
close(msgCtx.responses)
@ -397,7 +408,7 @@ func (l *Conn) processMessages() {
if msgCtx, ok := l.messageContexts[message.MessageID]; ok {
msgCtx.sendResponse(&PacketResponse{message.Packet, nil})
} else {
log.Printf("Received unexpected message %d, %v", message.MessageID, l.isClosing)
log.Printf("Received unexpected message %d, %v", message.MessageID, l.isClosing())
ber.PrintPacket(message.Packet)
}
case MessageTimeout:
@ -439,8 +450,8 @@ func (l *Conn) reader() {
packet, err := ber.ReadPacket(l.conn)
if err != nil {
// A read error is expected here if we are closing the connection...
if !l.isClosing {
l.closeErr = fmt.Errorf("unable to read LDAP response packet: %s", err)
if !l.isClosing() {
l.closeErr.Store(fmt.Errorf("unable to read LDAP response packet: %s", err))
l.Debug.Printf("reader error: %s", err.Error())
}
return

View File

@ -110,13 +110,13 @@ func (s *ActivityService) ListEvents(opt *ListOptions) ([]*Event, *Response, err
return nil, nil, err
}
events := new([]*Event)
resp, err := s.client.Do(req, events)
var events []*Event
resp, err := s.client.Do(req, &events)
if err != nil {
return nil, resp, err
}
return *events, resp, err
return events, resp, nil
}
// ListRepositoryEvents lists events for a repository.
@ -134,13 +134,13 @@ func (s *ActivityService) ListRepositoryEvents(owner, repo string, opt *ListOpti
return nil, nil, err
}
events := new([]*Event)
resp, err := s.client.Do(req, events)
var events []*Event
resp, err := s.client.Do(req, &events)
if err != nil {
return nil, resp, err
}
return *events, resp, err
return events, resp, nil
}
// ListIssueEventsForRepository lists issue events for a repository.
@ -158,13 +158,13 @@ func (s *ActivityService) ListIssueEventsForRepository(owner, repo string, opt *
return nil, nil, err
}
events := new([]*IssueEvent)
resp, err := s.client.Do(req, events)
var events []*IssueEvent
resp, err := s.client.Do(req, &events)
if err != nil {
return nil, resp, err
}
return *events, resp, err
return events, resp, nil
}
// ListEventsForRepoNetwork lists public events for a network of repositories.
@ -182,13 +182,13 @@ func (s *ActivityService) ListEventsForRepoNetwork(owner, repo string, opt *List
return nil, nil, err
}
events := new([]*Event)
resp, err := s.client.Do(req, events)
var events []*Event
resp, err := s.client.Do(req, &events)
if err != nil {
return nil, resp, err
}
return *events, resp, err
return events, resp, nil
}
// ListEventsForOrganization lists public events for an organization.
@ -206,13 +206,13 @@ func (s *ActivityService) ListEventsForOrganization(org string, opt *ListOptions
return nil, nil, err
}
events := new([]*Event)
resp, err := s.client.Do(req, events)
var events []*Event
resp, err := s.client.Do(req, &events)
if err != nil {
return nil, resp, err
}
return *events, resp, err
return events, resp, nil
}
// ListEventsPerformedByUser lists the events performed by a user. If publicOnly is
@ -236,13 +236,13 @@ func (s *ActivityService) ListEventsPerformedByUser(user string, publicOnly bool
return nil, nil, err
}
events := new([]*Event)
resp, err := s.client.Do(req, events)
var events []*Event
resp, err := s.client.Do(req, &events)
if err != nil {
return nil, resp, err
}
return *events, resp, err
return events, resp, nil
}
// ListEventsReceivedByUser lists the events received by a user. If publicOnly is
@ -266,13 +266,13 @@ func (s *ActivityService) ListEventsReceivedByUser(user string, publicOnly bool,
return nil, nil, err
}
events := new([]*Event)
resp, err := s.client.Do(req, events)
var events []*Event
resp, err := s.client.Do(req, &events)
if err != nil {
return nil, resp, err
}
return *events, resp, err
return events, resp, nil
}
// ListUserEventsForOrganization provides the users organization dashboard. You
@ -291,11 +291,11 @@ func (s *ActivityService) ListUserEventsForOrganization(org, user string, opt *L
return nil, nil, err
}
events := new([]*Event)
resp, err := s.client.Do(req, events)
var events []*Event
resp, err := s.client.Do(req, &events)
if err != nil {
return nil, resp, err
}
return *events, resp, err
return events, resp, nil
}

View File

@ -37,13 +37,13 @@ func (s *ActivityService) ListStargazers(owner, repo string, opt *ListOptions) (
// TODO: remove custom Accept header when this API fully launches
req.Header.Set("Accept", mediaTypeStarringPreview)
stargazers := new([]*Stargazer)
resp, err := s.client.Do(req, stargazers)
var stargazers []*Stargazer
resp, err := s.client.Do(req, &stargazers)
if err != nil {
return nil, resp, err
}
return *stargazers, resp, err
return stargazers, resp, nil
}
// ActivityListStarredOptions specifies the optional parameters to the
@ -84,13 +84,13 @@ func (s *ActivityService) ListStarred(user string, opt *ActivityListStarredOptio
// TODO: remove custom Accept header when this API fully launches
req.Header.Set("Accept", mediaTypeStarringPreview)
repos := new([]*StarredRepository)
resp, err := s.client.Do(req, repos)
var repos []*StarredRepository
resp, err := s.client.Do(req, &repos)
if err != nil {
return nil, resp, err
}
return *repos, resp, err
return repos, resp, nil
}
// IsStarred checks if a repository is starred by authenticated user.

View File

@ -37,13 +37,13 @@ func (s *ActivityService) ListWatchers(owner, repo string, opt *ListOptions) ([]
return nil, nil, err
}
watchers := new([]*User)
resp, err := s.client.Do(req, watchers)
var watchers []*User
resp, err := s.client.Do(req, &watchers)
if err != nil {
return nil, resp, err
}
return *watchers, resp, err
return watchers, resp, nil
}
// ListWatched lists the repositories the specified user is watching. Passing
@ -67,13 +67,13 @@ func (s *ActivityService) ListWatched(user string, opt *ListOptions) ([]*Reposit
return nil, nil, err
}
watched := new([]*Repository)
resp, err := s.client.Do(req, watched)
var watched []*Repository
resp, err := s.client.Do(req, &watched)
if err != nil {
return nil, resp, err
}
return *watched, resp, err
return watched, resp, nil
}
// GetRepositorySubscription returns the subscription for the specified

View File

@ -146,12 +146,12 @@ func (s *AuthorizationsService) List(opt *ListOptions) ([]*Authorization, *Respo
return nil, nil, err
}
auths := new([]*Authorization)
resp, err := s.client.Do(req, auths)
var auths []*Authorization
resp, err := s.client.Do(req, &auths)
if err != nil {
return nil, resp, err
}
return *auths, resp, err
return auths, resp, nil
}
// Get a single authorization.

View File

@ -423,26 +423,26 @@ type PullRequestReviewCommentEvent struct {
//
// GitHub API docs: http://developer.github.com/v3/activity/events/types/#pushevent
type PushEvent struct {
PushID *int `json:"push_id,omitempty"`
Head *string `json:"head,omitempty"`
Ref *string `json:"ref,omitempty"`
Size *int `json:"size,omitempty"`
Commits []PushEventCommit `json:"commits,omitempty"`
Repo *PushEventRepository `json:"repository,omitempty"`
Before *string `json:"before,omitempty"`
DistinctSize *int `json:"distinct_size,omitempty"`
PushID *int `json:"push_id,omitempty"`
Head *string `json:"head,omitempty"`
Ref *string `json:"ref,omitempty"`
Size *int `json:"size,omitempty"`
Commits []PushEventCommit `json:"commits,omitempty"`
Before *string `json:"before,omitempty"`
DistinctSize *int `json:"distinct_size,omitempty"`
// The following fields are only populated by Webhook events.
After *string `json:"after,omitempty"`
Created *bool `json:"created,omitempty"`
Deleted *bool `json:"deleted,omitempty"`
Forced *bool `json:"forced,omitempty"`
BaseRef *string `json:"base_ref,omitempty"`
Compare *string `json:"compare,omitempty"`
HeadCommit *PushEventCommit `json:"head_commit,omitempty"`
Pusher *User `json:"pusher,omitempty"`
Sender *User `json:"sender,omitempty"`
Installation *Installation `json:"installation,omitempty"`
After *string `json:"after,omitempty"`
Created *bool `json:"created,omitempty"`
Deleted *bool `json:"deleted,omitempty"`
Forced *bool `json:"forced,omitempty"`
BaseRef *string `json:"base_ref,omitempty"`
Compare *string `json:"compare,omitempty"`
Repo *PushEventRepository `json:"repository,omitempty"`
HeadCommit *PushEventCommit `json:"head_commit,omitempty"`
Pusher *User `json:"pusher,omitempty"`
Sender *User `json:"sender,omitempty"`
Installation *Installation `json:"installation,omitempty"`
}
func (p PushEvent) String() string {
@ -460,14 +460,13 @@ type PushEventCommit struct {
SHA *string `json:"sha,omitempty"`
// The following fields are only populated by Webhook events.
ID *string `json:"id,omitempty"`
TreeID *string `json:"tree_id,omitempty"`
Timestamp *Timestamp `json:"timestamp,omitempty"`
Committer *CommitAuthor `json:"committer,omitempty"`
Added []string `json:"added,omitempty"`
Removed []string `json:"removed,omitempty"`
Modified []string `json:"modified,omitempty"`
Installation *Installation `json:"installation,omitempty"`
ID *string `json:"id,omitempty"`
TreeID *string `json:"tree_id,omitempty"`
Timestamp *Timestamp `json:"timestamp,omitempty"`
Committer *CommitAuthor `json:"committer,omitempty"`
Added []string `json:"added,omitempty"`
Removed []string `json:"removed,omitempty"`
Modified []string `json:"modified,omitempty"`
}
func (p PushEventCommit) String() string {
@ -500,11 +499,13 @@ type PushEventRepository struct {
DefaultBranch *string `json:"default_branch,omitempty"`
MasterBranch *string `json:"master_branch,omitempty"`
Organization *string `json:"organization,omitempty"`
// The following fields are only populated by Webhook events.
URL *string `json:"url,omitempty"`
HTMLURL *string `json:"html_url,omitempty"`
Installation *Installation `json:"installation,omitempty"`
URL *string `json:"url,omitempty"`
HTMLURL *string `json:"html_url,omitempty"`
StatusesURL *string `json:"statuses_url,omitempty"`
GitURL *string `json:"git_url,omitempty"`
SSHURL *string `json:"ssh_url,omitempty"`
CloneURL *string `json:"clone_url,omitempty"`
SVNURL *string `json:"svn_url,omitempty"`
}
// PushEventRepoOwner is a basic representation of user/org in a PushEvent payload.

View File

@ -42,6 +42,7 @@ type GistFilename string
type GistFile struct {
Size *int `json:"size,omitempty"`
Filename *string `json:"filename,omitempty"`
Language *string `json:"language,omitempty"`
Type *string `json:"type,omitempty"`
RawURL *string `json:"raw_url,omitempty"`
Content *string `json:"content,omitempty"`
@ -109,13 +110,13 @@ func (s *GistsService) List(user string, opt *GistListOptions) ([]*Gist, *Respon
return nil, nil, err
}
gists := new([]*Gist)
resp, err := s.client.Do(req, gists)
var gists []*Gist
resp, err := s.client.Do(req, &gists)
if err != nil {
return nil, resp, err
}
return *gists, resp, err
return gists, resp, nil
}
// ListAll lists all public gists.
@ -132,13 +133,13 @@ func (s *GistsService) ListAll(opt *GistListOptions) ([]*Gist, *Response, error)
return nil, nil, err
}
gists := new([]*Gist)
resp, err := s.client.Do(req, gists)
var gists []*Gist
resp, err := s.client.Do(req, &gists)
if err != nil {
return nil, resp, err
}
return *gists, resp, err
return gists, resp, nil
}
// ListStarred lists starred gists of authenticated user.
@ -155,13 +156,13 @@ func (s *GistsService) ListStarred(opt *GistListOptions) ([]*Gist, *Response, er
return nil, nil, err
}
gists := new([]*Gist)
resp, err := s.client.Do(req, gists)
var gists []*Gist
resp, err := s.client.Do(req, &gists)
if err != nil {
return nil, resp, err
}
return *gists, resp, err
return gists, resp, nil
}
// Get a single gist.
@ -246,13 +247,13 @@ func (s *GistsService) ListCommits(id string) ([]*GistCommit, *Response, error)
return nil, nil, err
}
gistCommits := new([]*GistCommit)
resp, err := s.client.Do(req, gistCommits)
var gistCommits []*GistCommit
resp, err := s.client.Do(req, &gistCommits)
if err != nil {
return nil, resp, err
}
return *gistCommits, resp, err
return gistCommits, resp, nil
}
// Delete a gist.
@ -334,11 +335,11 @@ func (s *GistsService) ListForks(id string) ([]*GistFork, *Response, error) {
return nil, nil, err
}
gistForks := new([]*GistFork)
resp, err := s.client.Do(req, gistForks)
var gistForks []*GistFork
resp, err := s.client.Do(req, &gistForks)
if err != nil {
return nil, resp, err
}
return *gistForks, resp, err
return gistForks, resp, nil
}

View File

@ -38,13 +38,13 @@ func (s *GistsService) ListComments(gistID string, opt *ListOptions) ([]*GistCom
return nil, nil, err
}
comments := new([]*GistComment)
resp, err := s.client.Do(req, comments)
var comments []*GistComment
resp, err := s.client.Do(req, &comments)
if err != nil {
return nil, resp, err
}
return *comments, resp, err
return comments, resp, nil
}
// GetComment retrieves a single comment from a gist.

View File

@ -93,6 +93,9 @@ const (
// https://developer.github.com/changes/2016-11-28-preview-org-membership/
mediaTypeOrgMembershipPreview = "application/vnd.github.korra-preview+json"
// https://developer.github.com/changes/2017-01-05-commit-search-api/
mediaTypeCommitSearchPreview = "application/vnd.github.cloak-preview+json"
)
// A Client manages communication with the GitHub API.

View File

@ -32,13 +32,13 @@ func (s GitignoresService) List() ([]string, *Response, error) {
return nil, nil, err
}
availableTemplates := new([]string)
resp, err := s.client.Do(req, availableTemplates)
var availableTemplates []string
resp, err := s.client.Do(req, &availableTemplates)
if err != nil {
return nil, resp, err
}
return *availableTemplates, resp, err
return availableTemplates, resp, nil
}
// Get a Gitignore by name.

View File

@ -28,11 +28,11 @@ func (s *IntegrationsService) ListInstallations(opt *ListOptions) ([]*Installati
// TODO: remove custom Accept header when this API fully launches.
req.Header.Set("Accept", mediaTypeIntegrationPreview)
i := new([]*Installation)
var i []*Installation
resp, err := s.client.Do(req, &i)
if err != nil {
return nil, resp, err
}
return *i, resp, err
return i, resp, nil
}

View File

@ -141,13 +141,13 @@ func (s *IssuesService) listIssues(u string, opt *IssueListOptions) ([]*Issue, *
// TODO: remove custom Accept header when this API fully launches.
req.Header.Set("Accept", mediaTypeReactionsPreview)
issues := new([]*Issue)
resp, err := s.client.Do(req, issues)
var issues []*Issue
resp, err := s.client.Do(req, &issues)
if err != nil {
return nil, resp, err
}
return *issues, resp, err
return issues, resp, nil
}
// IssueListByRepoOptions specifies the optional parameters to the
@ -208,13 +208,13 @@ func (s *IssuesService) ListByRepo(owner string, repo string, opt *IssueListByRe
// TODO: remove custom Accept header when this API fully launches.
req.Header.Set("Accept", mediaTypeReactionsPreview)
issues := new([]*Issue)
resp, err := s.client.Do(req, issues)
var issues []*Issue
resp, err := s.client.Do(req, &issues)
if err != nil {
return nil, resp, err
}
return *issues, resp, err
return issues, resp, nil
}
// Get a single issue.

View File

@ -22,13 +22,13 @@ func (s *IssuesService) ListAssignees(owner, repo string, opt *ListOptions) ([]*
if err != nil {
return nil, nil, err
}
assignees := new([]*User)
resp, err := s.client.Do(req, assignees)
var assignees []*User
resp, err := s.client.Do(req, &assignees)
if err != nil {
return nil, resp, err
}
return *assignees, resp, err
return assignees, resp, nil
}
// IsAssignee checks if a user is an assignee for the specified repository.

View File

@ -66,13 +66,13 @@ func (s *IssuesService) ListComments(owner string, repo string, number int, opt
// TODO: remove custom Accept header when this API fully launches.
req.Header.Set("Accept", mediaTypeReactionsPreview)
comments := new([]*IssueComment)
resp, err := s.client.Do(req, comments)
var comments []*IssueComment
resp, err := s.client.Do(req, &comments)
if err != nil {
return nil, resp, err
}
return *comments, resp, err
return comments, resp, nil
}
// GetComment fetches the specified issue comment.

View File

@ -33,13 +33,13 @@ func (s *IssuesService) ListLabels(owner string, repo string, opt *ListOptions)
return nil, nil, err
}
labels := new([]*Label)
resp, err := s.client.Do(req, labels)
var labels []*Label
resp, err := s.client.Do(req, &labels)
if err != nil {
return nil, resp, err
}
return *labels, resp, err
return labels, resp, nil
}
// GetLabel gets a single label.
@ -126,13 +126,13 @@ func (s *IssuesService) ListLabelsByIssue(owner string, repo string, number int,
return nil, nil, err
}
labels := new([]*Label)
resp, err := s.client.Do(req, labels)
var labels []*Label
resp, err := s.client.Do(req, &labels)
if err != nil {
return nil, resp, err
}
return *labels, resp, err
return labels, resp, nil
}
// AddLabelsToIssue adds labels to an issue.
@ -145,13 +145,13 @@ func (s *IssuesService) AddLabelsToIssue(owner string, repo string, number int,
return nil, nil, err
}
l := new([]*Label)
resp, err := s.client.Do(req, l)
var l []*Label
resp, err := s.client.Do(req, &l)
if err != nil {
return nil, resp, err
}
return *l, resp, err
return l, resp, nil
}
// RemoveLabelForIssue removes a label for an issue.
@ -176,13 +176,13 @@ func (s *IssuesService) ReplaceLabelsForIssue(owner string, repo string, number
return nil, nil, err
}
l := new([]*Label)
resp, err := s.client.Do(req, l)
var l []*Label
resp, err := s.client.Do(req, &l)
if err != nil {
return nil, resp, err
}
return *l, resp, err
return l, resp, nil
}
// RemoveLabelsForIssue removes all labels for an issue.
@ -212,11 +212,11 @@ func (s *IssuesService) ListLabelsForMilestone(owner string, repo string, number
return nil, nil, err
}
labels := new([]*Label)
resp, err := s.client.Do(req, labels)
var labels []*Label
resp, err := s.client.Do(req, &labels)
if err != nil {
return nil, resp, err
}
return *labels, resp, err
return labels, resp, nil
}

View File

@ -66,13 +66,13 @@ func (s *IssuesService) ListMilestones(owner string, repo string, opt *Milestone
return nil, nil, err
}
milestones := new([]*Milestone)
resp, err := s.client.Do(req, milestones)
var milestones []*Milestone
resp, err := s.client.Do(req, &milestones)
if err != nil {
return nil, resp, err
}
return *milestones, resp, err
return milestones, resp, nil
}
// GetMilestone gets a single milestone.

View File

@ -67,13 +67,13 @@ func (s *LicensesService) List() ([]*License, *Response, error) {
// TODO: remove custom Accept header when this API fully launches
req.Header.Set("Accept", mediaTypeLicensesPreview)
licenses := new([]*License)
resp, err := s.client.Do(req, licenses)
var licenses []*License
resp, err := s.client.Do(req, &licenses)
if err != nil {
return nil, resp, err
}
return *licenses, resp, err
return licenses, resp, nil
}
// Get extended metadata for one license.

View File

@ -230,13 +230,13 @@ func (s *MigrationService) CommitAuthors(owner, repo string) ([]*SourceImportAut
// TODO: remove custom Accept header when this API fully launches
req.Header.Set("Accept", mediaTypeImportPreview)
authors := new([]*SourceImportAuthor)
resp, err := s.client.Do(req, authors)
var authors []*SourceImportAuthor
resp, err := s.client.Do(req, &authors)
if err != nil {
return nil, resp, err
}
return *authors, resp, err
return authors, resp, nil
}
// MapCommitAuthor updates an author's identity for the import. Your
@ -300,13 +300,13 @@ func (s *MigrationService) LargeFiles(owner, repo string) ([]*LargeFile, *Respon
// TODO: remove custom Accept header when this API fully launches
req.Header.Set("Accept", mediaTypeImportPreview)
files := new([]*LargeFile)
resp, err := s.client.Do(req, files)
var files []*LargeFile
resp, err := s.client.Do(req, &files)
if err != nil {
return nil, resp, err
}
return *files, resp, err
return files, resp, nil
}
// CancelImport stops an import for a repository.

View File

@ -187,11 +187,11 @@ func (c *Client) ListServiceHooks() ([]*ServiceHook, *Response, error) {
return nil, nil, err
}
hooks := new([]*ServiceHook)
resp, err := c.Do(req, hooks)
var hooks []*ServiceHook
resp, err := c.Do(req, &hooks)
if err != nil {
return nil, resp, err
}
return *hooks, resp, err
return hooks, resp, nil
}

View File

@ -125,13 +125,13 @@ func (s *OrganizationsService) List(user string, opt *ListOptions) ([]*Organizat
return nil, nil, err
}
orgs := new([]*Organization)
resp, err := s.client.Do(req, orgs)
var orgs []*Organization
resp, err := s.client.Do(req, &orgs)
if err != nil {
return nil, resp, err
}
return *orgs, resp, err
return orgs, resp, nil
}
// Get fetches an organization by name.

View File

@ -22,13 +22,13 @@ func (s *OrganizationsService) ListHooks(org string, opt *ListOptions) ([]*Hook,
return nil, nil, err
}
hooks := new([]*Hook)
resp, err := s.client.Do(req, hooks)
var hooks []*Hook
resp, err := s.client.Do(req, &hooks)
if err != nil {
return nil, resp, err
}
return *hooks, resp, err
return hooks, resp, nil
}
// GetHook returns a single specified Hook.

View File

@ -86,13 +86,13 @@ func (s *OrganizationsService) ListMembers(org string, opt *ListMembersOptions)
return nil, nil, err
}
members := new([]*User)
resp, err := s.client.Do(req, members)
var members []*User
resp, err := s.client.Do(req, &members)
if err != nil {
return nil, resp, err
}
return *members, resp, err
return members, resp, nil
}
// IsMember checks if a user is a member of an organization.
@ -270,3 +270,29 @@ func (s *OrganizationsService) RemoveOrgMembership(user, org string) (*Response,
return s.client.Do(req, nil)
}
// ListPendingOrgInvitations returns a list of pending invitations.
//
// GitHub API docs: https://developer.github.com/v3/orgs/members/#list-pending-organization-invitations
func (s *OrganizationsService) ListPendingOrgInvitations(org int, opt *ListOptions) ([]*Invitation, *Response, error) {
u := fmt.Sprintf("orgs/%v/invitations", org)
u, err := addOptions(u, opt)
if err != nil {
return nil, nil, err
}
req, err := s.client.NewRequest("GET", u, nil)
if err != nil {
return nil, nil, err
}
// TODO: remove custom Accept header when this API fully launches.
req.Header.Set("Accept", mediaTypeOrgMembershipPreview)
var pendingInvitations []*Invitation
resp, err := s.client.Do(req, &pendingInvitations)
if err != nil {
return nil, resp, err
}
return pendingInvitations, resp, nil
}

View File

@ -44,13 +44,15 @@ func (t Team) String() string {
return Stringify(t)
}
// Invitation represents a team member's inviation status
// Invitation represents a team member's invitation status.
type Invitation struct {
ID *int `json:"id,omitempty"`
Login *string `json:"login,omitempty"`
Email *string `json:"email,omitempty"`
ID *int `json:"id,omitempty"`
Login *string `json:"login,omitempty"`
Email *string `json:"email,omitempty"`
// Role can be one of the values - 'direct_member', 'admin', 'billing_manager', 'hiring_manager', or 'reinstate'.
Role *string `json:"role,omitempty"`
CreatedAt *time.Time `json:"created_at,omitempty"`
Inviter *User `json:"inviter,omitempty"`
}
func (i Invitation) String() string {
@ -72,13 +74,13 @@ func (s *OrganizationsService) ListTeams(org string, opt *ListOptions) ([]*Team,
return nil, nil, err
}
teams := new([]*Team)
resp, err := s.client.Do(req, teams)
var teams []*Team
resp, err := s.client.Do(req, &teams)
if err != nil {
return nil, resp, err
}
return *teams, resp, err
return teams, resp, nil
}
// GetTeam fetches a team by ID.
@ -177,13 +179,13 @@ func (s *OrganizationsService) ListTeamMembers(team int, opt *OrganizationListTe
return nil, nil, err
}
members := new([]*User)
resp, err := s.client.Do(req, members)
var members []*User
resp, err := s.client.Do(req, &members)
if err != nil {
return nil, resp, err
}
return *members, resp, err
return members, resp, nil
}
// IsTeamMember checks if a user is a member of the specified team.
@ -216,13 +218,13 @@ func (s *OrganizationsService) ListTeamRepos(team int, opt *ListOptions) ([]*Rep
return nil, nil, err
}
repos := new([]*Repository)
resp, err := s.client.Do(req, repos)
var repos []*Repository
resp, err := s.client.Do(req, &repos)
if err != nil {
return nil, resp, err
}
return *repos, resp, err
return repos, resp, nil
}
// IsTeamRepo checks if a team manages the specified repository. If the
@ -305,13 +307,13 @@ func (s *OrganizationsService) ListUserTeams(opt *ListOptions) ([]*Team, *Respon
return nil, nil, err
}
teams := new([]*Team)
resp, err := s.client.Do(req, teams)
var teams []*Team
resp, err := s.client.Do(req, &teams)
if err != nil {
return nil, resp, err
}
return *teams, resp, err
return teams, resp, nil
}
// GetTeamMembership returns the membership status for a user in a team.
@ -414,11 +416,11 @@ func (s *OrganizationsService) ListPendingTeamInvitations(team int, opt *ListOpt
// TODO: remove custom Accept header when this API fully launches.
req.Header.Set("Accept", mediaTypeOrgMembershipPreview)
pendingInvitations := new([]*Invitation)
resp, err := s.client.Do(req, pendingInvitations)
var pendingInvitations []*Invitation
resp, err := s.client.Do(req, &pendingInvitations)
if err != nil {
return nil, resp, err
}
return *pendingInvitations, resp, err
return pendingInvitations, resp, nil
}

View File

@ -107,13 +107,13 @@ func (s *PullRequestsService) List(owner string, repo string, opt *PullRequestLi
return nil, nil, err
}
pulls := new([]*PullRequest)
resp, err := s.client.Do(req, pulls)
var pulls []*PullRequest
resp, err := s.client.Do(req, &pulls)
if err != nil {
return nil, resp, err
}
return *pulls, resp, err
return pulls, resp, nil
}
// Get a single pull request.
@ -189,12 +189,33 @@ func (s *PullRequestsService) Create(owner string, repo string, pull *NewPullReq
return p, resp, err
}
type pullRequestUpdate struct {
Title *string `json:"title,omitempty"`
Body *string `json:"body,omitempty"`
State *string `json:"state,omitempty"`
Base *string `json:"base,omitempty"`
}
// Edit a pull request.
//
// The following fields are editable: Title, Body, State, and Base.Ref.
// Base.Ref updates the base branch of the pull request.
//
// GitHub API docs: https://developer.github.com/v3/pulls/#update-a-pull-request
func (s *PullRequestsService) Edit(owner string, repo string, number int, pull *PullRequest) (*PullRequest, *Response, error) {
u := fmt.Sprintf("repos/%v/%v/pulls/%d", owner, repo, number)
req, err := s.client.NewRequest("PATCH", u, pull)
update := new(pullRequestUpdate)
if pull != nil {
update.Title = pull.Title
update.Body = pull.Body
update.State = pull.State
if pull.Base != nil {
update.Base = pull.Base.Ref
}
}
req, err := s.client.NewRequest("PATCH", u, update)
if err != nil {
return nil, nil, err
}
@ -223,13 +244,13 @@ func (s *PullRequestsService) ListCommits(owner string, repo string, number int,
return nil, nil, err
}
commits := new([]*RepositoryCommit)
resp, err := s.client.Do(req, commits)
var commits []*RepositoryCommit
resp, err := s.client.Do(req, &commits)
if err != nil {
return nil, resp, err
}
return *commits, resp, err
return commits, resp, nil
}
// ListFiles lists the files in a pull request.
@ -247,13 +268,13 @@ func (s *PullRequestsService) ListFiles(owner string, repo string, number int, o
return nil, nil, err
}
commitFiles := new([]*CommitFile)
resp, err := s.client.Do(req, commitFiles)
var commitFiles []*CommitFile
resp, err := s.client.Do(req, &commitFiles)
if err != nil {
return nil, resp, err
}
return *commitFiles, resp, err
return commitFiles, resp, nil
}
// IsMerged checks if a pull request has been merged.

View File

@ -74,13 +74,13 @@ func (s *PullRequestsService) ListComments(owner string, repo string, number int
// TODO: remove custom Accept header when this API fully launches.
req.Header.Set("Accept", mediaTypeReactionsPreview)
comments := new([]*PullRequestComment)
resp, err := s.client.Do(req, comments)
var comments []*PullRequestComment
resp, err := s.client.Do(req, &comments)
if err != nil {
return nil, resp, err
}
return *comments, resp, err
return comments, resp, nil
}
// GetComment fetches the specified pull request comment.

View File

@ -175,13 +175,13 @@ func (s *RepositoriesService) List(user string, opt *RepositoryListOptions) ([]*
// TODO: remove custom Accept header when license support fully launches
req.Header.Set("Accept", mediaTypeLicensesPreview)
repos := new([]*Repository)
resp, err := s.client.Do(req, repos)
var repos []*Repository
resp, err := s.client.Do(req, &repos)
if err != nil {
return nil, resp, err
}
return *repos, resp, err
return repos, resp, nil
}
// RepositoryListByOrgOptions specifies the optional parameters to the
@ -212,13 +212,13 @@ func (s *RepositoriesService) ListByOrg(org string, opt *RepositoryListByOrgOpti
// TODO: remove custom Accept header when license support fully launches
req.Header.Set("Accept", mediaTypeLicensesPreview)
repos := new([]*Repository)
resp, err := s.client.Do(req, repos)
var repos []*Repository
resp, err := s.client.Do(req, &repos)
if err != nil {
return nil, resp, err
}
return *repos, resp, err
return repos, resp, nil
}
// RepositoryListAllOptions specifies the optional parameters to the
@ -244,13 +244,13 @@ func (s *RepositoriesService) ListAll(opt *RepositoryListAllOptions) ([]*Reposit
return nil, nil, err
}
repos := new([]*Repository)
resp, err := s.client.Do(req, repos)
var repos []*Repository
resp, err := s.client.Do(req, &repos)
if err != nil {
return nil, resp, err
}
return *repos, resp, err
return repos, resp, nil
}
// Create a new repository. If an organization is specified, the new
@ -408,13 +408,13 @@ func (s *RepositoriesService) ListContributors(owner string, repository string,
return nil, nil, err
}
contributor := new([]*Contributor)
resp, err := s.client.Do(req, contributor)
var contributor []*Contributor
resp, err := s.client.Do(req, &contributor)
if err != nil {
return nil, nil, err
}
return *contributor, resp, err
return contributor, resp, nil
}
// ListLanguages lists languages for the specified repository. The returned map
@ -458,13 +458,13 @@ func (s *RepositoriesService) ListTeams(owner string, repo string, opt *ListOpti
return nil, nil, err
}
teams := new([]*Team)
resp, err := s.client.Do(req, teams)
var teams []*Team
resp, err := s.client.Do(req, &teams)
if err != nil {
return nil, resp, err
}
return *teams, resp, err
return teams, resp, nil
}
// RepositoryTag represents a repository tag.
@ -490,13 +490,13 @@ func (s *RepositoriesService) ListTags(owner string, repo string, opt *ListOptio
return nil, nil, err
}
tags := new([]*RepositoryTag)
resp, err := s.client.Do(req, tags)
var tags []*RepositoryTag
resp, err := s.client.Do(req, &tags)
if err != nil {
return nil, resp, err
}
return *tags, resp, err
return tags, resp, nil
}
// Branch represents a repository branch
@ -575,13 +575,13 @@ func (s *RepositoriesService) ListBranches(owner string, repo string, opt *ListO
// TODO: remove custom Accept header when this API fully launches
req.Header.Set("Accept", mediaTypeProtectedBranchesPreview)
branches := new([]*Branch)
resp, err := s.client.Do(req, branches)
var branches []*Branch
resp, err := s.client.Do(req, &branches)
if err != nil {
return nil, resp, err
}
return *branches, resp, err
return branches, resp, nil
}
// GetBranch gets the specified branch for a repository.

View File

@ -22,13 +22,13 @@ func (s *RepositoriesService) ListCollaborators(owner, repo string, opt *ListOpt
return nil, nil, err
}
users := new([]*User)
resp, err := s.client.Do(req, users)
var users []*User
resp, err := s.client.Do(req, &users)
if err != nil {
return nil, resp, err
}
return *users, resp, err
return users, resp, nil
}
// IsCollaborator checks whether the specified Github user has collaborator
@ -49,6 +49,35 @@ func (s *RepositoriesService) IsCollaborator(owner, repo, user string) (bool, *R
return isCollab, resp, err
}
// RepositoryPermissionLevel represents the permission level an organization
// member has for a given repository.
type RepositoryPermissionLevel struct {
// Possible values: "admin", "write", "read", "none"
Permission *string `json:"permission,omitempty"`
User *User `json:"user,omitempty"`
}
// GetPermissionLevel retrieves the specific permission level a collaborator has for a given repository.
// GitHub API docs: https://developer.github.com/v3/repos/collaborators/#review-a-users-permission-level
func (s *RepositoriesService) GetPermissionLevel(owner, repo, user string) (*RepositoryPermissionLevel, *Response, error) {
u := fmt.Sprintf("repos/%v/%v/collaborators/%v/permission", owner, repo, user)
req, err := s.client.NewRequest("GET", u, nil)
if err != nil {
return nil, nil, err
}
// TODO: remove custom Accept header when this API fully launches.
req.Header.Set("Accept", mediaTypeOrgMembershipPreview)
rpl := new(RepositoryPermissionLevel)
resp, err := s.client.Do(req, rpl)
if err != nil {
return nil, resp, err
}
return rpl, resp, nil
}
// RepositoryAddCollaboratorOptions specifies the optional parameters to the
// RepositoriesService.AddCollaborator method.
type RepositoryAddCollaboratorOptions struct {

View File

@ -50,13 +50,13 @@ func (s *RepositoriesService) ListComments(owner, repo string, opt *ListOptions)
// TODO: remove custom Accept header when this API fully launches.
req.Header.Set("Accept", mediaTypeReactionsPreview)
comments := new([]*RepositoryComment)
resp, err := s.client.Do(req, comments)
var comments []*RepositoryComment
resp, err := s.client.Do(req, &comments)
if err != nil {
return nil, resp, err
}
return *comments, resp, err
return comments, resp, nil
}
// ListCommitComments lists all the comments for a given commit SHA.
@ -77,13 +77,13 @@ func (s *RepositoriesService) ListCommitComments(owner, repo, sha string, opt *L
// TODO: remove custom Accept header when this API fully launches.
req.Header.Set("Accept", mediaTypeReactionsPreview)
comments := new([]*RepositoryComment)
resp, err := s.client.Do(req, comments)
var comments []*RepositoryComment
resp, err := s.client.Do(req, &comments)
if err != nil {
return nil, resp, err
}
return *comments, resp, err
return comments, resp, nil
}
// CreateComment creates a comment for the given commit.

View File

@ -120,13 +120,13 @@ func (s *RepositoriesService) ListCommits(owner, repo string, opt *CommitsListOp
return nil, nil, err
}
commits := new([]*RepositoryCommit)
resp, err := s.client.Do(req, commits)
var commits []*RepositoryCommit
resp, err := s.client.Do(req, &commits)
if err != nil {
return nil, resp, err
}
return *commits, resp, err
return commits, resp, nil
}
// GetCommit fetches the specified commit, including all details about it.

View File

@ -73,13 +73,13 @@ func (s *RepositoriesService) ListDeployments(owner, repo string, opt *Deploymen
return nil, nil, err
}
deployments := new([]*Deployment)
resp, err := s.client.Do(req, deployments)
var deployments []*Deployment
resp, err := s.client.Do(req, &deployments)
if err != nil {
return nil, resp, err
}
return *deployments, resp, err
return deployments, resp, nil
}
// GetDeployment returns a single deployment of a repository.
@ -166,13 +166,13 @@ func (s *RepositoriesService) ListDeploymentStatuses(owner, repo string, deploym
return nil, nil, err
}
statuses := new([]*DeploymentStatus)
resp, err := s.client.Do(req, statuses)
var statuses []*DeploymentStatus
resp, err := s.client.Do(req, &statuses)
if err != nil {
return nil, resp, err
}
return *statuses, resp, err
return statuses, resp, nil
}
// GetDeploymentStatus returns a single deployment status of a repository.

View File

@ -32,13 +32,13 @@ func (s *RepositoriesService) ListForks(owner, repo string, opt *RepositoryListF
return nil, nil, err
}
repos := new([]*Repository)
resp, err := s.client.Do(req, repos)
var repos []*Repository
resp, err := s.client.Do(req, &repos)
if err != nil {
return nil, resp, err
}
return *repos, resp, err
return repos, resp, nil
}
// RepositoryCreateForkOptions specifies the optional parameters to the

View File

@ -117,13 +117,13 @@ func (s *RepositoriesService) ListHooks(owner, repo string, opt *ListOptions) ([
return nil, nil, err
}
hooks := new([]*Hook)
resp, err := s.client.Do(req, hooks)
var hooks []*Hook
resp, err := s.client.Do(req, &hooks)
if err != nil {
return nil, resp, err
}
return *hooks, resp, err
return hooks, resp, nil
}
// GetHook returns a single specified Hook.

View File

@ -24,13 +24,13 @@ func (s *RepositoriesService) ListKeys(owner string, repo string, opt *ListOptio
return nil, nil, err
}
keys := new([]*Key)
resp, err := s.client.Do(req, keys)
var keys []*Key
resp, err := s.client.Do(req, &keys)
if err != nil {
return nil, resp, err
}
return *keys, resp, err
return keys, resp, nil
}
// GetKey fetches a single deploy key.

View File

@ -76,12 +76,12 @@ func (s *RepositoriesService) ListReleases(owner, repo string, opt *ListOptions)
return nil, nil, err
}
releases := new([]*RepositoryRelease)
resp, err := s.client.Do(req, releases)
var releases []*RepositoryRelease
resp, err := s.client.Do(req, &releases)
if err != nil {
return nil, resp, err
}
return *releases, resp, err
return releases, resp, nil
}
// GetRelease fetches a single release.
@ -188,12 +188,12 @@ func (s *RepositoriesService) ListReleaseAssets(owner, repo string, id int, opt
return nil, nil, err
}
assets := new([]*ReleaseAsset)
resp, err := s.client.Do(req, assets)
var assets []*ReleaseAsset
resp, err := s.client.Do(req, &assets)
if err != nil {
return nil, resp, nil
return nil, resp, err
}
return *assets, resp, err
return assets, resp, nil
}
// GetReleaseAsset fetches a single release asset.
@ -210,7 +210,7 @@ func (s *RepositoriesService) GetReleaseAsset(owner, repo string, id int) (*Rele
asset := new(ReleaseAsset)
resp, err := s.client.Do(req, asset)
if err != nil {
return nil, resp, nil
return nil, resp, err
}
return asset, resp, err
}
@ -248,7 +248,7 @@ func (s *RepositoriesService) DownloadReleaseAsset(owner, repo string, id int) (
if !strings.Contains(err.Error(), "disable redirect") {
return nil, "", err
}
return nil, loc, nil
return nil, loc, nil // Intentionally return no error with valid redirect URL.
}
if err := CheckResponse(resp); err != nil {

View File

@ -54,13 +54,13 @@ func (s *RepositoriesService) ListStatuses(owner, repo, ref string, opt *ListOpt
return nil, nil, err
}
statuses := new([]*RepoStatus)
resp, err := s.client.Do(req, statuses)
var statuses []*RepoStatus
resp, err := s.client.Do(req, &statuses)
if err != nil {
return nil, resp, err
}
return *statuses, resp, err
return statuses, resp, nil
}
// CreateStatus creates a new status for a repository at the specified

View File

@ -60,13 +60,13 @@ func (s *RepositoriesService) ListTrafficReferrers(owner, repo string) ([]*Traff
return nil, nil, err
}
trafficReferrers := new([]*TrafficReferrer)
var trafficReferrers []*TrafficReferrer
resp, err := s.client.Do(req, &trafficReferrers)
if err != nil {
return nil, resp, err
}
return *trafficReferrers, resp, err
return trafficReferrers, resp, nil
}
// ListTrafficPaths list the top 10 popular content over the last 14 days.
@ -80,13 +80,13 @@ func (s *RepositoriesService) ListTrafficPaths(owner, repo string) ([]*TrafficPa
return nil, nil, err
}
var paths = new([]*TrafficPath)
var paths []*TrafficPath
resp, err := s.client.Do(req, &paths)
if err != nil {
return nil, resp, err
}
return *paths, resp, err
return paths, resp, nil
}
// ListTrafficViews get total number of views for the last 14 days and breaks it down either per day or week.

View File

@ -21,6 +21,7 @@ type SearchService service
type SearchOptions struct {
// How to sort the search results. Possible values are:
// - for repositories: stars, fork, updated
// - for commits: author-date, committer-date
// - for code: indexed
// - for issues: comments, created, updated
// - for users: followers, repositories, joined
@ -54,6 +55,37 @@ func (s *SearchService) Repositories(query string, opt *SearchOptions) (*Reposit
return result, resp, err
}
// CommitsSearchResult represents the result of a commits search.
type CommitsSearchResult struct {
Total *int `json:"total_count,omitempty"`
IncompleteResults *bool `json:"incomplete_results,omitempty"`
Commits []*CommitResult `json:"items,omitempty"`
}
// CommitResult represents a commit object as returned in commit search endpoint response.
type CommitResult struct {
Hash *string `json:"hash,omitempty"`
Message *string `json:"message,omitempty"`
AuthorID *int `json:"author_id,omitempty"`
AuthorName *string `json:"author_name,omitempty"`
AuthorEmail *string `json:"author_email,omitempty"`
AuthorDate *Timestamp `json:"author_date,omitempty"`
CommitterID *int `json:"committer_id,omitempty"`
CommitterName *string `json:"committer_name,omitempty"`
CommitterEmail *string `json:"committer_email,omitempty"`
CommitterDate *Timestamp `json:"committer_date,omitempty"`
Repository *Repository `json:"repository,omitempty"`
}
// Commits searches commits via various criteria.
//
// GitHub API Docs: https://developer.github.com/v3/search/#search-commits
func (s *SearchService) Commits(query string, opt *SearchOptions) (*CommitsSearchResult, *Response, error) {
result := new(CommitsSearchResult)
resp, err := s.search("commits", query, opt, result)
return result, resp, err
}
// IssuesSearchResult represents the result of an issues search.
type IssuesSearchResult struct {
Total *int `json:"total_count,omitempty"`
@ -136,7 +168,7 @@ func (s *SearchService) Code(query string, opt *SearchOptions) (*CodeSearchResul
}
// Helper function that executes search queries against different
// GitHub search types (repositories, code, issues, users)
// GitHub search types (repositories, commits, code, issues, users)
func (s *SearchService) search(searchType string, query string, opt *SearchOptions, result interface{}) (*Response, error) {
params, err := qs.Values(opt)
if err != nil {
@ -150,7 +182,12 @@ func (s *SearchService) search(searchType string, query string, opt *SearchOptio
return nil, err
}
if opt != nil && opt.TextMatch {
switch {
case searchType == "commits":
// Accept header for search commits preview endpoint
// TODO: remove custom Accept header when this API fully launches.
req.Header.Set("Accept", mediaTypeCommitSearchPreview)
case opt != nil && opt.TextMatch:
// Accept header defaults to "application/vnd.github.v3+json"
// We change it here to fetch back text-match metadata
req.Header.Set("Accept", "application/vnd.github.v3.text-match+json")

View File

@ -156,13 +156,13 @@ func (s *UsersService) ListAll(opt *UserListOptions) ([]*User, *Response, error)
return nil, nil, err
}
users := new([]*User)
resp, err := s.client.Do(req, users)
var users []*User
resp, err := s.client.Do(req, &users)
if err != nil {
return nil, resp, err
}
return *users, resp, err
return users, resp, nil
}
// ListInvitations lists all currently-open repository invitations for the

View File

@ -27,13 +27,13 @@ func (s *UsersService) ListEmails(opt *ListOptions) ([]*UserEmail, *Response, er
return nil, nil, err
}
emails := new([]*UserEmail)
resp, err := s.client.Do(req, emails)
var emails []*UserEmail
resp, err := s.client.Do(req, &emails)
if err != nil {
return nil, resp, err
}
return *emails, resp, err
return emails, resp, nil
}
// AddEmails adds email addresses of the authenticated user.
@ -46,13 +46,13 @@ func (s *UsersService) AddEmails(emails []string) ([]*UserEmail, *Response, erro
return nil, nil, err
}
e := new([]*UserEmail)
resp, err := s.client.Do(req, e)
var e []*UserEmail
resp, err := s.client.Do(req, &e)
if err != nil {
return nil, resp, err
}
return *e, resp, err
return e, resp, nil
}
// DeleteEmails deletes email addresses from authenticated user.

View File

@ -28,13 +28,13 @@ func (s *UsersService) ListFollowers(user string, opt *ListOptions) ([]*User, *R
return nil, nil, err
}
users := new([]*User)
resp, err := s.client.Do(req, users)
var users []*User
resp, err := s.client.Do(req, &users)
if err != nil {
return nil, resp, err
}
return *users, resp, err
return users, resp, nil
}
// ListFollowing lists the people that a user is following. Passing the empty
@ -58,13 +58,13 @@ func (s *UsersService) ListFollowing(user string, opt *ListOptions) ([]*User, *R
return nil, nil, err
}
users := new([]*User)
resp, err := s.client.Do(req, users)
var users []*User
resp, err := s.client.Do(req, &users)
if err != nil {
return nil, resp, err
}
return *users, resp, err
return users, resp, nil
}
// IsFollowing checks if "user" is following "target". Passing the empty

View File

@ -41,13 +41,13 @@ func (s *UsersService) ListKeys(user string, opt *ListOptions) ([]*Key, *Respons
return nil, nil, err
}
keys := new([]*Key)
resp, err := s.client.Do(req, keys)
var keys []*Key
resp, err := s.client.Do(req, &keys)
if err != nil {
return nil, resp, err
}
return *keys, resp, err
return keys, resp, nil
}
// GetKey fetches a single public key.

View File

@ -389,9 +389,15 @@ func (p *Parser) listType() (*ast.ListType, error) {
l.Add(node)
needComma = true
case token.LBRACK:
// TODO(arslan) should we support nested lists? Even though it's
// written in README of HCL, it's not a part of the grammar
// (not defined in parse.y)
node, err := p.listType()
if err != nil {
return nil, &PosError{
Pos: tok.Pos,
Err: fmt.Errorf(
"error while trying to parse list within list: %s", err),
}
}
l.Add(node)
case token.RBRACK:
// finished
l.Rbrack = p.tok.Pos

39
vendor/github.com/lib/pq/conn.go generated vendored
View File

@ -98,6 +98,15 @@ type conn struct {
namei int
scratch [512]byte
txnStatus transactionStatus
txnClosed chan<- struct{}
// Save connection arguments to use during CancelRequest.
dialer Dialer
opts values
// Cancellation key data for use with CancelRequest messages.
processID int
secretKey int
parameterStatus parameterStatus
@ -307,7 +316,10 @@ func DialOpen(d Dialer, name string) (_ driver.Conn, err error) {
}
}
cn := &conn{}
cn := &conn{
opts: o,
dialer: d,
}
err = cn.handleDriverSettings(o)
if err != nil {
return nil, err
@ -529,7 +541,15 @@ func (cn *conn) Begin() (_ driver.Tx, err error) {
return cn, nil
}
func (cn *conn) closeTxn() {
if cn.txnClosed != nil {
close(cn.txnClosed)
cn.txnClosed = nil
}
}
func (cn *conn) Commit() (err error) {
defer cn.closeTxn()
if cn.bad {
return driver.ErrBadConn
}
@ -565,6 +585,7 @@ func (cn *conn) Commit() (err error) {
}
func (cn *conn) Rollback() (err error) {
defer cn.closeTxn()
if cn.bad {
return driver.ErrBadConn
}
@ -796,7 +817,11 @@ func (cn *conn) Close() (err error) {
}
// Implement the "Queryer" interface
func (cn *conn) Query(query string, args []driver.Value) (_ driver.Rows, err error) {
func (cn *conn) Query(query string, args []driver.Value) (driver.Rows, error) {
return cn.query(query, args)
}
func (cn *conn) query(query string, args []driver.Value) (_ *rows, err error) {
if cn.bad {
return nil, driver.ErrBadConn
}
@ -1074,6 +1099,7 @@ func (cn *conn) startup(o values) {
t, r := cn.recv()
switch t {
case 'K':
cn.processBackendKeyData(r)
case 'S':
cn.processParameterStatus(r)
case 'R':
@ -1301,6 +1327,7 @@ func (cn *conn) parseComplete(commandTag string) (driver.Result, string) {
type rows struct {
cn *conn
closed chan<- struct{}
colNames []string
colTyps []oid.Oid
colFmts []format
@ -1309,6 +1336,9 @@ type rows struct {
}
func (rs *rows) Close() error {
if rs.closed != nil {
defer close(rs.closed)
}
// no need to look at cn.bad as Next() will
for {
err := rs.Next(nil)
@ -1513,6 +1543,11 @@ func (cn *conn) readReadyForQuery() {
}
}
func (c *conn) processBackendKeyData(r *readBuf) {
c.processID = r.int32()
c.secretKey = r.int32()
}
func (cn *conn) readParseResponse() {
t, r := cn.recv1()
switch t {

92
vendor/github.com/lib/pq/conn_go18.go generated vendored Normal file
View File

@ -0,0 +1,92 @@
// +build go1.8
package pq
import (
"context"
"database/sql/driver"
"errors"
)
// Implement the "QueryerContext" interface
func (cn *conn) QueryContext(ctx context.Context, query string, args []driver.NamedValue) (driver.Rows, error) {
list := make([]driver.Value, len(args))
for i, nv := range args {
list[i] = nv.Value
}
var closed chan<- struct{}
if ctx.Done() != nil {
closed = watchCancel(ctx, cn.cancel)
}
r, err := cn.query(query, list)
if err != nil {
return nil, err
}
r.closed = closed
return r, nil
}
// Implement the "ExecerContext" interface
func (cn *conn) ExecContext(ctx context.Context, query string, args []driver.NamedValue) (driver.Result, error) {
list := make([]driver.Value, len(args))
for i, nv := range args {
list[i] = nv.Value
}
if ctx.Done() != nil {
closed := watchCancel(ctx, cn.cancel)
defer close(closed)
}
return cn.Exec(query, list)
}
// Implement the "ConnBeginTx" interface
func (cn *conn) BeginTx(ctx context.Context, opts driver.TxOptions) (driver.Tx, error) {
if opts.Isolation != 0 {
return nil, errors.New("isolation levels not supported")
}
if opts.ReadOnly {
return nil, errors.New("read-only transactions not supported")
}
tx, err := cn.Begin()
if err != nil {
return nil, err
}
if ctx.Done() != nil {
cn.txnClosed = watchCancel(ctx, cn.cancel)
}
return tx, nil
}
func watchCancel(ctx context.Context, cancel func()) chan<- struct{} {
closed := make(chan struct{})
go func() {
select {
case <-ctx.Done():
cancel()
case <-closed:
}
}()
return closed
}
func (cn *conn) cancel() {
var err error
can := &conn{}
can.c, err = dial(cn.dialer, cn.opts)
if err != nil {
return
}
can.ssl(cn.opts)
defer can.errRecover(&err)
w := can.writeBuf(0)
w.int32(80877102) // cancel request code
w.int32(cn.processID)
w.int32(cn.secretKey)
can.sendStartupPacket(w)
_ = can.c.Close()
}

View File

@ -4,7 +4,7 @@ This library is a [RabbitMQ HTTP API](https://raw.githack.com/rabbitmq/rabbitmq-
## Supported Go Versions
Rabbit Hole requires Go 1.3+.
Rabbit Hole requires Go 1.6+.
## Supported RabbitMQ Versions
@ -293,4 +293,4 @@ See [CONTRIBUTING.md](https://github.com/michaelklishin/rabbit-hole/blob/master/
2-clause BSD license.
(c) Michael S. Klishin, 2013-2016.
(c) Michael S. Klishin, 2013-2017.

View File

@ -3,7 +3,6 @@ package rabbithole
import (
"encoding/json"
"net/http"
"net/url"
)
//
@ -59,7 +58,7 @@ func (c *Client) ListBindings() (rec []BindingInfo, err error) {
// Returns all bindings in a virtual host.
func (c *Client) ListBindingsIn(vhost string) (rec []BindingInfo, err error) {
req, err := newGETRequest(c, "bindings/"+url.QueryEscape(vhost))
req, err := newGETRequest(c, "bindings/" + PathEscape(vhost))
if err != nil {
return []BindingInfo{}, err
}
@ -95,7 +94,7 @@ func (c *Client) ListBindingsIn(vhost string) (rec []BindingInfo, err error) {
// Returns all bindings of individual queue.
func (c *Client) ListQueueBindings(vhost, queue string) (rec []BindingInfo, err error) {
req, err := newGETRequest(c, "queues/"+url.QueryEscape(vhost)+"/"+url.QueryEscape(queue)+"/bindings")
req, err := newGETRequest(c, "queues/" + PathEscape(vhost) + "/" + PathEscape(queue) + "/bindings")
if err != nil {
return []BindingInfo{}, err
}
@ -123,7 +122,9 @@ func (c *Client) DeclareBinding(vhost string, info BindingInfo) (res *http.Respo
return nil, err
}
req, err := newRequestWithBody(c, "POST", "bindings/"+url.QueryEscape(vhost)+"/e/"+url.QueryEscape(info.Source)+"/"+url.QueryEscape(string(info.DestinationType[0]))+"/"+url.QueryEscape(info.Destination), body)
req, err := newRequestWithBody(c, "POST", "bindings/" + PathEscape(vhost) +
"/e/" + PathEscape(info.Source) + "/" + PathEscape(string(info.DestinationType[0])) +
"/" + PathEscape(info.Destination), body)
if err != nil {
return nil, err
@ -143,7 +144,9 @@ func (c *Client) DeclareBinding(vhost string, info BindingInfo) (res *http.Respo
// DeleteBinding delets an individual binding
func (c *Client) DeleteBinding(vhost string, info BindingInfo) (res *http.Response, err error) {
req, err := newRequestWithBody(c, "DELETE", "bindings/"+url.QueryEscape(vhost)+"/e/"+url.QueryEscape(info.Source)+"/"+url.QueryEscape(string(info.DestinationType[0]))+"/"+url.QueryEscape(info.Destination)+"/"+url.QueryEscape(info.PropertiesKey), nil)
req, err := newRequestWithBody(c, "DELETE", "bindings/" + PathEscape(vhost) +
"/e/" + PathEscape(info.Source) + "/" + PathEscape(string(info.DestinationType[0])) +
"/" + PathEscape(info.Destination) + "/" + PathEscape(info.PropertiesKey), nil)
if err != nil {
return nil, err
}

View File

@ -1,7 +1,5 @@
package rabbithole
import "net/url"
// Brief (very incomplete) connection information.
type BriefConnectionDetails struct {
// Connection name
@ -73,7 +71,7 @@ func (c *Client) ListChannels() (rec []ChannelInfo, err error) {
// Returns channel information.
func (c *Client) GetChannel(name string) (rec *ChannelInfo, err error) {
req, err := newGETRequest(c, "channels/"+url.QueryEscape(name))
req, err := newGETRequest(c, "channels/" + PathEscape(name))
if err != nil {
return nil, err
}

View File

@ -35,7 +35,7 @@ func NewClient(uri string, username string, password string) (me *Client, err er
return me, nil
}
//NewTLSClient Creates a Client with a Transport Layer; it is up to the developer to make that layer Secure.
// Creates a client with a transport; it is up to the developer to make that layer secure.
func NewTLSClient(uri string, username string, password string, transport *http.Transport) (me *Client, err error) {
u, err := url.Parse(uri)
if err != nil {
@ -60,12 +60,12 @@ func (c *Client) SetTransport(transport *http.Transport) {
func newGETRequest(client *Client, path string) (*http.Request, error) {
s := client.Endpoint + "/api/" + path
req, err := http.NewRequest("GET", s, nil)
req.Close = true
req.SetBasicAuth(client.Username, client.Password)
// set Opaque to preserve percent-encoded path. MK.
// set Opaque to preserve the percent-encoded path. MK.
req.URL.Opaque = "//" + client.host + "/api/" + path
return req, err
@ -88,8 +88,8 @@ func newRequestWithBody(client *Client, method string, path string, body []byte)
req.Close = true
req.SetBasicAuth(client.Username, client.Password)
// set Opaque to preserve percent-encoded path. MK.
req.URL.Opaque = "//" + client.host + "/api/" + path
// set Opaque to preserve the percent-encoded path.
req.URL.Opaque = "//" + client.host + "/api/" + path
req.Header.Add("Content-Type", "application/json")
@ -140,3 +140,136 @@ func executeAndParseRequest(client *Client, req *http.Request, rec interface{})
func isNotFound(res *http.Response) bool {
return res.StatusCode == http.StatusNotFound
}
// This is an ugly hack: we copy relevant bits from
// https://github.com/golang/go/blob/7e2bf952a905f16a17099970392ea17545cdd193/src/net/url/url.go
// because up to Go 1.8 there is no built-in method
// (and url.QueryEscape isn't suitable since it encodes
// spaces as + and not %20).
//
// See https://github.com/golang/go/issues/13737,
// https://github.com/golang/go/commit/7e2bf952a905f16a17099970392ea17545cdd193
// PathEscape escapes the string so it can be safely placed
// inside a URL path segment.
func PathEscape(s string) string {
return escape(s, encodePathSegment)
}
type encoding int
const (
encodePath encoding = 1 + iota
encodePathSegment
encodeHost
encodeZone
encodeUserPassword
encodeQueryComponent
encodeFragment
)
func escape(s string, mode encoding) string {
spaceCount, hexCount := 0, 0
for i := 0; i < len(s); i++ {
c := s[i]
if shouldEscape(c, mode) {
if c == ' ' && mode == encodeQueryComponent {
spaceCount++
} else {
hexCount++
}
}
}
if spaceCount == 0 && hexCount == 0 {
return s
}
t := make([]byte, len(s)+2*hexCount)
j := 0
for i := 0; i < len(s); i++ {
switch c := s[i]; {
case c == ' ' && mode == encodeQueryComponent:
t[j] = '+'
j++
case shouldEscape(c, mode):
t[j] = '%'
t[j+1] = "0123456789ABCDEF"[c>>4]
t[j+2] = "0123456789ABCDEF"[c&15]
j += 3
default:
t[j] = s[i]
j++
}
}
return string(t)
}
// Return true if the specified character should be escaped when
// appearing in a URL string, according to RFC 3986.
//
// Please be informed that for now shouldEscape does not check all
// reserved characters correctly. See golang.org/issue/5684.
func shouldEscape(c byte, mode encoding) bool {
// §2.3 Unreserved characters (alphanum)
if 'A' <= c && c <= 'Z' || 'a' <= c && c <= 'z' || '0' <= c && c <= '9' {
return false
}
if mode == encodeHost || mode == encodeZone {
// §3.2.2 Host allows
// sub-delims = "!" / "$" / "&" / "'" / "(" / ")" / "*" / "+" / "," / ";" / "="
// as part of reg-name.
// We add : because we include :port as part of host.
// We add [ ] because we include [ipv6]:port as part of host.
// We add < > because they're the only characters left that
// we could possibly allow, and Parse will reject them if we
// escape them (because hosts can't use %-encoding for
// ASCII bytes).
switch c {
case '!', '$', '&', '\'', '(', ')', '*', '+', ',', ';', '=', ':', '[', ']', '<', '>', '"':
return false
}
}
switch c {
case '-', '_', '.', '~': // §2.3 Unreserved characters (mark)
return false
case '$', '&', '+', ',', '/', ':', ';', '=', '?', '@': // §2.2 Reserved characters (reserved)
// Different sections of the URL allow a few of
// the reserved characters to appear unescaped.
switch mode {
case encodePath: // §3.3
// The RFC allows : @ & = + $ but saves / ; , for assigning
// meaning to individual path segments. This package
// only manipulates the path as a whole, so we allow those
// last three as well. That leaves only ? to escape.
return c == '?'
case encodePathSegment: // §3.3
// The RFC allows : @ & = + $ but saves / ; , for assigning
// meaning to individual path segments.
return c == '/' || c == ';' || c == ',' || c == '?'
case encodeUserPassword: // §3.2.1
// The RFC allows ';', ':', '&', '=', '+', '$', and ',' in
// userinfo, so we must escape only '@', '/', and '?'.
// The parsing of userinfo treats ':' as special so we must escape
// that too.
return c == '@' || c == '/' || c == '?' || c == ':'
case encodeQueryComponent: // §3.4
// The RFC reserves (so we must escape) everything.
return true
case encodeFragment: // §4.1
// The RFC text is silent but the grammar allows
// everything, so escape nothing.
return false
}
}
// Everything else must be escaped.
return true
}

View File

@ -2,7 +2,6 @@ package rabbithole
import (
"net/http"
"net/url"
)
// Provides information about connection to a RabbitMQ node.
@ -100,7 +99,7 @@ func (c *Client) ListConnections() (rec []ConnectionInfo, err error) {
//
func (c *Client) GetConnection(name string) (rec *ConnectionInfo, err error) {
req, err := newGETRequest(c, "connections/"+url.QueryEscape(name))
req, err := newGETRequest(c, "connections/" + PathEscape(name))
if err != nil {
return nil, err
}
@ -117,7 +116,7 @@ func (c *Client) GetConnection(name string) (rec *ConnectionInfo, err error) {
//
func (c *Client) CloseConnection(name string) (res *http.Response, err error) {
req, err := newRequestWithBody(c, "DELETE", "connections/"+url.QueryEscape(name), nil)
req, err := newRequestWithBody(c, "DELETE", "connections/" + PathEscape(name), nil)
if err != nil {
return nil, err
}

View File

@ -3,7 +3,6 @@ package rabbithole
import (
"encoding/json"
"net/http"
"net/url"
)
//
@ -55,7 +54,7 @@ func (c *Client) ListExchanges() (rec []ExchangeInfo, err error) {
//
func (c *Client) ListExchangesIn(vhost string) (rec []ExchangeInfo, err error) {
req, err := newGETRequest(c, "exchanges/"+url.QueryEscape(vhost))
req, err := newGETRequest(c, "exchanges/" + PathEscape(vhost))
if err != nil {
return []ExchangeInfo{}, err
}
@ -162,7 +161,7 @@ type DetailedExchangeInfo struct {
}
func (c *Client) GetExchange(vhost, exchange string) (rec *DetailedExchangeInfo, err error) {
req, err := newGETRequest(c, "exchanges/"+url.QueryEscape(vhost)+"/"+url.QueryEscape(exchange))
req, err := newGETRequest(c, "exchanges/" + PathEscape(vhost) + "/" + PathEscape(exchange))
if err != nil {
return nil, err
}
@ -187,7 +186,7 @@ func (c *Client) DeclareExchange(vhost, exchange string, info ExchangeSettings)
return nil, err
}
req, err := newRequestWithBody(c, "PUT", "exchanges/"+url.QueryEscape(vhost)+"/"+url.QueryEscape(exchange), body)
req, err := newRequestWithBody(c, "PUT", "exchanges/" + PathEscape(vhost) + "/" + PathEscape(exchange), body)
if err != nil {
return nil, err
}
@ -205,7 +204,7 @@ func (c *Client) DeclareExchange(vhost, exchange string, info ExchangeSettings)
//
func (c *Client) DeleteExchange(vhost, exchange string) (res *http.Response, err error) {
req, err := newRequestWithBody(c, "DELETE", "exchanges/"+url.QueryEscape(vhost)+"/"+url.QueryEscape(exchange), nil)
req, err := newRequestWithBody(c, "DELETE", "exchanges/" + PathEscape(vhost) + "/" + PathEscape(exchange), nil)
if err != nil {
return nil, err
}

View File

@ -3,7 +3,6 @@ package rabbithole
import (
"encoding/json"
"net/http"
"net/url"
)
// Federation definition: additional arguments
@ -39,7 +38,7 @@ func (c *Client) PutFederationUpstream(vhost string, upstreamName string, fDef F
return nil, err
}
req, err := newRequestWithBody(c, "PUT", "parameters/federation-upstream/"+url.QueryEscape(vhost)+"/"+url.QueryEscape(upstreamName), body)
req, err := newRequestWithBody(c, "PUT", "parameters/federation-upstream/" + PathEscape(vhost) + "/" + PathEscape(upstreamName), body)
if err != nil {
return nil, err
}
@ -58,7 +57,7 @@ func (c *Client) PutFederationUpstream(vhost string, upstreamName string, fDef F
// Deletes a federation upstream.
func (c *Client) DeleteFederationUpstream(vhost, upstreamName string) (res *http.Response, err error) {
req, err := newRequestWithBody(c, "DELETE", "parameters/federation-upstream/"+url.QueryEscape(vhost)+"/"+url.QueryEscape(upstreamName), nil)
req, err := newRequestWithBody(c, "DELETE", "parameters/federation-upstream/" + PathEscape(vhost) + "/" + PathEscape(upstreamName), nil)
if err != nil {
return nil, err
}

View File

@ -1,10 +1,5 @@
package rabbithole
import (
"net/url"
)
// TODO: this probably should be fixed in RabbitMQ management plugin
type OsPid string
type NameDescriptionEnabled struct {
@ -288,7 +283,7 @@ func (c *Client) ListNodes() (rec []NodeInfo, err error) {
// }
func (c *Client) GetNode(name string) (rec *NodeInfo, err error) {
req, err := newGETRequest(c, "nodes/"+url.QueryEscape(name))
req, err := newGETRequest(c, "nodes/" + PathEscape(name))
if err != nil {
return nil, err
}

View File

@ -3,7 +3,6 @@ package rabbithole
import (
"encoding/json"
"net/http"
"net/url"
)
//
@ -46,7 +45,7 @@ func (c *Client) ListPermissions() (rec []PermissionInfo, err error) {
// Returns permissions of a specific user.
func (c *Client) ListPermissionsOf(username string) (rec []PermissionInfo, err error) {
req, err := newGETRequest(c, "users/"+url.QueryEscape(username)+"/permissions")
req, err := newGETRequest(c, "users/" + PathEscape(username) + "/permissions")
if err != nil {
return []PermissionInfo{}, err
}
@ -64,7 +63,7 @@ func (c *Client) ListPermissionsOf(username string) (rec []PermissionInfo, err e
// Returns permissions of user in virtual host.
func (c *Client) GetPermissionsIn(vhost, username string) (rec PermissionInfo, err error) {
req, err := newGETRequest(c, "permissions/"+url.QueryEscape(vhost)+"/"+url.QueryEscape(username))
req, err := newGETRequest(c, "permissions/" + PathEscape(vhost) + "/" + PathEscape(username))
if err != nil {
return PermissionInfo{}, err
}
@ -93,7 +92,7 @@ func (c *Client) UpdatePermissionsIn(vhost, username string, permissions Permiss
return nil, err
}
req, err := newRequestWithBody(c, "PUT", "permissions/"+url.QueryEscape(vhost)+"/"+url.QueryEscape(username), body)
req, err := newRequestWithBody(c, "PUT", "permissions/" + PathEscape(vhost) + "/" + PathEscape(username), body)
if err != nil {
return nil, err
}
@ -112,7 +111,7 @@ func (c *Client) UpdatePermissionsIn(vhost, username string, permissions Permiss
// Clears (deletes) permissions of user in virtual host.
func (c *Client) ClearPermissionsIn(vhost, username string) (res *http.Response, err error) {
req, err := newRequestWithBody(c, "DELETE", "permissions/"+url.QueryEscape(vhost)+"/"+url.QueryEscape(username), nil)
req, err := newRequestWithBody(c, "DELETE", "permissions/" + PathEscape(vhost) + "/" + PathEscape(username), nil)
if err != nil {
return nil, err
}

View File

@ -3,7 +3,6 @@ package rabbithole
import (
"encoding/json"
"net/http"
"net/url"
)
// Policy definition: additional arguments
@ -53,7 +52,7 @@ func (c *Client) ListPolicies() (rec []Policy, err error) {
// Returns policies in a specific virtual host.
func (c *Client) ListPoliciesIn(vhost string) (rec []Policy, err error) {
req, err := newGETRequest(c, "policies/"+url.QueryEscape(vhost))
req, err := newGETRequest(c, "policies/" + PathEscape(vhost))
if err != nil {
return nil, err
}
@ -71,7 +70,7 @@ func (c *Client) ListPoliciesIn(vhost string) (rec []Policy, err error) {
// Returns individual policy in virtual host.
func (c *Client) GetPolicy(vhost, name string) (rec *Policy, err error) {
req, err := newGETRequest(c, "policies/"+url.QueryEscape(vhost)+"/"+url.QueryEscape(name))
req, err := newGETRequest(c, "policies/" + PathEscape(vhost) + "/" + PathEscape(name))
if err != nil {
return nil, err
}
@ -94,7 +93,7 @@ func (c *Client) PutPolicy(vhost string, name string, policy Policy) (res *http.
return nil, err
}
req, err := newRequestWithBody(c, "PUT", "policies/"+url.QueryEscape(vhost)+"/"+url.QueryEscape(name), body)
req, err := newRequestWithBody(c, "PUT", "policies/" + PathEscape(vhost) + "/" + PathEscape(name), body)
if err != nil {
return nil, err
}
@ -113,7 +112,7 @@ func (c *Client) PutPolicy(vhost string, name string, policy Policy) (res *http.
// Deletes a policy.
func (c *Client) DeletePolicy(vhost, name string) (res *http.Response, err error) {
req, err := newRequestWithBody(c, "DELETE", "policies/"+url.QueryEscape(vhost)+"/"+url.QueryEscape(name), nil)
req, err := newRequestWithBody(c, "DELETE", "policies/" + PathEscape(vhost) + "/" + PathEscape(name), nil)
if err != nil {
return nil, err
}

View File

@ -198,7 +198,7 @@ func (c *Client) ListQueuesWithParameters(params url.Values) (rec []QueueInfo, e
//
func (c *Client) ListQueuesIn(vhost string) (rec []QueueInfo, err error) {
req, err := newGETRequest(c, "queues/"+url.QueryEscape(vhost))
req, err := newGETRequest(c, "queues/" + PathEscape(vhost))
if err != nil {
return []QueueInfo{}, err
}
@ -215,7 +215,7 @@ func (c *Client) ListQueuesIn(vhost string) (rec []QueueInfo, err error) {
//
func (c *Client) GetQueue(vhost, queue string) (rec *DetailedQueueInfo, err error) {
req, err := newGETRequest(c, "queues/"+url.QueryEscape(vhost)+"/"+url.QueryEscape(queue))
req, err := newGETRequest(c, "queues/" + PathEscape(vhost) + "/" + PathEscape(queue))
if err != nil {
return nil, err
@ -232,7 +232,7 @@ func (c *Client) GetQueue(vhost, queue string) (rec *DetailedQueueInfo, err erro
// GET /api/queues/{vhost}/{name}?{query}
func (c *Client) GetQueueWithParameters(vhost, queue string, qs url.Values) (rec *DetailedQueueInfo, err error) {
req, err := newGETRequestWithParameters(c, "queues/"+url.QueryEscape(vhost)+"/"+url.QueryEscape(queue), qs)
req, err := newGETRequestWithParameters(c, "queues/" + PathEscape(vhost) + "/" + PathEscape(queue), qs)
if err != nil {
return nil, err
}
@ -263,7 +263,7 @@ func (c *Client) DeclareQueue(vhost, queue string, info QueueSettings) (res *htt
return nil, err
}
req, err := newRequestWithBody(c, "PUT", "queues/"+url.QueryEscape(vhost)+"/"+url.QueryEscape(queue), body)
req, err := newRequestWithBody(c, "PUT", "queues/" + PathEscape(vhost) + "/" + PathEscape(queue), body)
if err != nil {
return nil, err
}
@ -281,7 +281,7 @@ func (c *Client) DeclareQueue(vhost, queue string, info QueueSettings) (res *htt
//
func (c *Client) DeleteQueue(vhost, queue string) (res *http.Response, err error) {
req, err := newRequestWithBody(c, "DELETE", "queues/"+url.QueryEscape(vhost)+"/"+url.QueryEscape(queue), nil)
req, err := newRequestWithBody(c, "DELETE", "queues/" + PathEscape(vhost) + "/" + PathEscape(queue), nil)
if err != nil {
return nil, err
}
@ -299,7 +299,7 @@ func (c *Client) DeleteQueue(vhost, queue string) (res *http.Response, err error
//
func (c *Client) PurgeQueue(vhost, queue string) (res *http.Response, err error) {
req, err := newRequestWithBody(c, "DELETE", "queues/"+url.QueryEscape(vhost)+"/"+url.QueryEscape(queue)+"/contents", nil)
req, err := newRequestWithBody(c, "DELETE", "queues/" + PathEscape(vhost) + "/" + PathEscape(queue) + "/contents", nil)
if err != nil {
return nil, err
}

View File

@ -3,7 +3,6 @@ package rabbithole
import (
"encoding/json"
"net/http"
"net/url"
)
type UserInfo struct {
@ -53,7 +52,7 @@ func (c *Client) ListUsers() (rec []UserInfo, err error) {
// Returns information about individual user.
func (c *Client) GetUser(username string) (rec *UserInfo, err error) {
req, err := newGETRequest(c, "users/"+url.QueryEscape(username))
req, err := newGETRequest(c, "users/" + PathEscape(username))
if err != nil {
return nil, err
}
@ -76,7 +75,7 @@ func (c *Client) PutUser(username string, info UserSettings) (res *http.Response
return nil, err
}
req, err := newRequestWithBody(c, "PUT", "users/"+url.QueryEscape(username), body)
req, err := newRequestWithBody(c, "PUT", "users/" + PathEscape(username), body)
if err != nil {
return nil, err
}
@ -95,7 +94,7 @@ func (c *Client) PutUser(username string, info UserSettings) (res *http.Response
// Deletes user.
func (c *Client) DeleteUser(username string) (res *http.Response, err error) {
req, err := newRequestWithBody(c, "DELETE", "users/"+url.QueryEscape(username), nil)
req, err := newRequestWithBody(c, "DELETE", "users/" + PathEscape(username), nil)
if err != nil {
return nil, err
}

View File

@ -3,7 +3,6 @@ package rabbithole
import (
"encoding/json"
"net/http"
"net/url"
)
//
@ -98,7 +97,7 @@ func (c *Client) ListVhosts() (rec []VhostInfo, err error) {
// Returns information about a specific virtual host.
func (c *Client) GetVhost(vhostname string) (rec *VhostInfo, err error) {
req, err := newGETRequest(c, "vhosts/"+url.QueryEscape(vhostname))
req, err := newGETRequest(c, "vhosts/" + PathEscape(vhostname))
if err != nil {
return nil, err
}
@ -127,7 +126,7 @@ func (c *Client) PutVhost(vhostname string, settings VhostSettings) (res *http.R
return nil, err
}
req, err := newRequestWithBody(c, "PUT", "vhosts/"+url.QueryEscape(vhostname), body)
req, err := newRequestWithBody(c, "PUT", "vhosts/" + PathEscape(vhostname), body)
if err != nil {
return nil, err
}
@ -146,7 +145,7 @@ func (c *Client) PutVhost(vhostname string, settings VhostSettings) (res *http.R
// Deletes a virtual host.
func (c *Client) DeleteVhost(vhostname string) (res *http.Response, err error) {
req, err := newRequestWithBody(c, "DELETE", "vhosts/"+url.QueryEscape(vhostname), nil)
req, err := newRequestWithBody(c, "DELETE", "vhosts/" + PathEscape(vhostname), nil)
if err != nil {
return nil, err
}

View File

@ -18,7 +18,7 @@ func BasicHelpFunc(app string) HelpFunc {
return func(commands map[string]CommandFactory) string {
var buf bytes.Buffer
buf.WriteString(fmt.Sprintf(
"usage: %s [--version] [--help] <command> [<args>]\n\n",
"Usage: %s [--version] [--help] <command> [<args>]\n\n",
app))
buf.WriteString("Available commands are:\n")

View File

@ -72,80 +72,80 @@ func (m MountStatsNFS) mountStats() {}
// by an NFS client to and from an NFS server.
type NFSBytesStats struct {
// Number of bytes read using the read() syscall.
Read int
Read uint64
// Number of bytes written using the write() syscall.
Write int
Write uint64
// Number of bytes read using the read() syscall in O_DIRECT mode.
DirectRead int
DirectRead uint64
// Number of bytes written using the write() syscall in O_DIRECT mode.
DirectWrite int
DirectWrite uint64
// Number of bytes read from the NFS server, in total.
ReadTotal int
ReadTotal uint64
// Number of bytes written to the NFS server, in total.
WriteTotal int
WriteTotal uint64
// Number of pages read directly via mmap()'d files.
ReadPages int
ReadPages uint64
// Number of pages written directly via mmap()'d files.
WritePages int
WritePages uint64
}
// A NFSEventsStats contains statistics about NFS event occurrences.
type NFSEventsStats struct {
// Number of times cached inode attributes are re-validated from the server.
InodeRevalidate int
InodeRevalidate uint64
// Number of times cached dentry nodes are re-validated from the server.
DnodeRevalidate int
DnodeRevalidate uint64
// Number of times an inode cache is cleared.
DataInvalidate int
DataInvalidate uint64
// Number of times cached inode attributes are invalidated.
AttributeInvalidate int
AttributeInvalidate uint64
// Number of times files or directories have been open()'d.
VFSOpen int
VFSOpen uint64
// Number of times a directory lookup has occurred.
VFSLookup int
VFSLookup uint64
// Number of times permissions have been checked.
VFSAccess int
VFSAccess uint64
// Number of updates (and potential writes) to pages.
VFSUpdatePage int
VFSUpdatePage uint64
// Number of pages read directly via mmap()'d files.
VFSReadPage int
VFSReadPage uint64
// Number of times a group of pages have been read.
VFSReadPages int
VFSReadPages uint64
// Number of pages written directly via mmap()'d files.
VFSWritePage int
VFSWritePage uint64
// Number of times a group of pages have been written.
VFSWritePages int
VFSWritePages uint64
// Number of times directory entries have been read with getdents().
VFSGetdents int
VFSGetdents uint64
// Number of times attributes have been set on inodes.
VFSSetattr int
VFSSetattr uint64
// Number of pending writes that have been forcefully flushed to the server.
VFSFlush int
VFSFlush uint64
// Number of times fsync() has been called on directories and files.
VFSFsync int
VFSFsync uint64
// Number of times locking has been attemped on a file.
VFSLock int
VFSLock uint64
// Number of times files have been closed and released.
VFSFileRelease int
VFSFileRelease uint64
// Unknown. Possibly unused.
CongestionWait int
CongestionWait uint64
// Number of times files have been truncated.
Truncation int
Truncation uint64
// Number of times a file has been grown due to writes beyond its existing end.
WriteExtension int
WriteExtension uint64
// Number of times a file was removed while still open by another process.
SillyRename int
SillyRename uint64
// Number of times the NFS server gave less data than expected while reading.
ShortRead int
ShortRead uint64
// Number of times the NFS server wrote less data than expected while writing.
ShortWrite int
ShortWrite uint64
// Number of times the NFS server indicated EJUKEBOX; retrieving data from
// offline storage.
JukeboxDelay int
JukeboxDelay uint64
// Number of NFS v4.1+ pNFS reads.
PNFSRead int
PNFSRead uint64
// Number of NFS v4.1+ pNFS writes.
PNFSWrite int
PNFSWrite uint64
}
// A NFSOperationStats contains statistics for a single operation.
@ -153,15 +153,15 @@ type NFSOperationStats struct {
// The name of the operation.
Operation string
// Number of requests performed for this operation.
Requests int
Requests uint64
// Number of times an actual RPC request has been transmitted for this operation.
Transmissions int
Transmissions uint64
// Number of times a request has had a major timeout.
MajorTimeouts int
MajorTimeouts uint64
// Number of bytes sent for this operation, including RPC headers and payload.
BytesSent int
BytesSent uint64
// Number of bytes received for this operation, including RPC headers and payload.
BytesReceived int
BytesReceived uint64
// Duration all requests spent queued for transmission before they were sent.
CumulativeQueueTime time.Duration
// Duration it took to get a reply back after the request was transmitted.
@ -174,41 +174,41 @@ type NFSOperationStats struct {
// responses.
type NFSTransportStats struct {
// The local port used for the NFS mount.
Port int
Port uint64
// Number of times the client has had to establish a connection from scratch
// to the NFS server.
Bind int
Bind uint64
// Number of times the client has made a TCP connection to the NFS server.
Connect int
Connect uint64
// Duration (in jiffies, a kernel internal unit of time) the NFS mount has
// spent waiting for connections to the server to be established.
ConnectIdleTime int
ConnectIdleTime uint64
// Duration since the NFS mount last saw any RPC traffic.
IdleTime time.Duration
// Number of RPC requests for this mount sent to the NFS server.
Sends int
Sends uint64
// Number of RPC responses for this mount received from the NFS server.
Receives int
Receives uint64
// Number of times the NFS server sent a response with a transaction ID
// unknown to this client.
BadTransactionIDs int
BadTransactionIDs uint64
// A running counter, incremented on each request as the current difference
// ebetween sends and receives.
CumulativeActiveRequests int
CumulativeActiveRequests uint64
// A running counter, incremented on each request by the current backlog
// queue size.
CumulativeBacklog int
CumulativeBacklog uint64
// Stats below only available with stat version 1.1.
// Maximum number of simultaneously active RPC requests ever used.
MaximumRPCSlotsUsed int
MaximumRPCSlotsUsed uint64
// A running counter, incremented on each request as the current size of the
// sending queue.
CumulativeSendingQueue int
CumulativeSendingQueue uint64
// A running counter, incremented on each request as the current size of the
// pending queue.
CumulativePendingQueue int
CumulativePendingQueue uint64
}
// parseMountStats parses a /proc/[pid]/mountstats file and returns a slice
@ -386,9 +386,9 @@ func parseNFSBytesStats(ss []string) (*NFSBytesStats, error) {
return nil, fmt.Errorf("invalid NFS bytes stats: %v", ss)
}
ns := make([]int, 0, fieldBytesLen)
ns := make([]uint64, 0, fieldBytesLen)
for _, s := range ss {
n, err := strconv.Atoi(s)
n, err := strconv.ParseUint(s, 10, 64)
if err != nil {
return nil, err
}
@ -415,9 +415,9 @@ func parseNFSEventsStats(ss []string) (*NFSEventsStats, error) {
return nil, fmt.Errorf("invalid NFS events stats: %v", ss)
}
ns := make([]int, 0, fieldEventsLen)
ns := make([]uint64, 0, fieldEventsLen)
for _, s := range ss {
n, err := strconv.Atoi(s)
n, err := strconv.ParseUint(s, 10, 64)
if err != nil {
return nil, err
}
@ -480,9 +480,9 @@ func parseNFSOperationStats(s *bufio.Scanner) ([]NFSOperationStats, error) {
}
// Skip string operation name for integers
ns := make([]int, 0, numFields-1)
ns := make([]uint64, 0, numFields-1)
for _, st := range ss[1:] {
n, err := strconv.Atoi(st)
n, err := strconv.ParseUint(st, 10, 64)
if err != nil {
return nil, err
}
@ -524,9 +524,9 @@ func parseNFSTransportStats(ss []string, statVersion string) (*NFSTransportStats
// Allocate enough for v1.1 stats since zero value for v1.1 stats will be okay
// in a v1.0 response
ns := make([]int, 0, fieldTransport11Len)
ns := make([]uint64, 0, fieldTransport11Len)
for _, s := range ss {
n, err := strconv.Atoi(s)
n, err := strconv.ParseUint(s, 10, 64)
if err != nil {
return nil, err
}

View File

@ -104,6 +104,21 @@ type directionAlgorithms struct {
Compression string
}
// rekeyBytes returns a rekeying intervals in bytes.
func (a *directionAlgorithms) rekeyBytes() int64 {
// According to RFC4344 block ciphers should rekey after
// 2^(BLOCKSIZE/4) blocks. For all AES flavors BLOCKSIZE is
// 128.
switch a.Cipher {
case "aes128-ctr", "aes192-ctr", "aes256-ctr", gcmCipherID, aes128cbcID:
return 16 * (1 << 32)
}
// For others, stick with RFC4253 recommendation to rekey after 1 Gb of data.
return 1 << 30
}
type algorithms struct {
kex string
hostKey string

View File

@ -65,8 +65,9 @@ type handshakeTransport struct {
pendingPackets [][]byte // Used when a key exchange is in progress.
// If the read loop wants to schedule a kex, it pings this
// channel, and the write loop will send out a kex message.
requestKex chan struct{}
// channel, and the write loop will send out a kex
// message. The boolean is whether this is the first request or not.
requestKex chan bool
// If the other side requests or confirms a kex, its kexInit
// packet is sent here for the write loop to find it.
@ -77,9 +78,14 @@ type handshakeTransport struct {
dialAddress string
remoteAddr net.Addr
readSinceKex uint64
// Algorithms agreed in the last key exchange.
algorithms *algorithms
writtenSinceKex uint64
readPacketsLeft uint32
readBytesLeft int64
writePacketsLeft uint32
writeBytesLeft int64
// The session ID or nil if first kex did not complete yet.
sessionID []byte
@ -96,11 +102,14 @@ func newHandshakeTransport(conn keyingTransport, config *Config, clientVersion,
serverVersion: serverVersion,
clientVersion: clientVersion,
incoming: make(chan []byte, chanSize),
requestKex: make(chan struct{}, 1),
requestKex: make(chan bool, 1),
startKex: make(chan *pendingKex, 1),
config: config,
}
// We always start with a mandatory key exchange.
t.requestKex <- true
return t
}
@ -174,12 +183,6 @@ func (t *handshakeTransport) readPacket() ([]byte, error) {
}
func (t *handshakeTransport) readLoop() {
// We always start with the mandatory key exchange. We use
// the channel for simplicity, and this works if we can rely
// on the SSH package itself not doing anything else before
// waitSession has completed.
t.requestKeyExchange()
first := true
for {
p, err := t.readOnePacket(first)
@ -227,14 +230,15 @@ func (t *handshakeTransport) recordWriteError(err error) {
func (t *handshakeTransport) requestKeyExchange() {
select {
case t.requestKex <- struct{}{}:
case t.requestKex <- false:
default:
// something already requested a kex, so do nothing.
}
}
func (t *handshakeTransport) kexLoop() {
firstSent := false
write:
for t.getWriteError() == nil {
var request *pendingKex
@ -247,7 +251,18 @@ write:
if !ok {
break write
}
case <-t.requestKex:
case requestFirst := <-t.requestKex:
// For the first key exchange, both
// sides will initiate a key exchange,
// and both channels will fire. To
// avoid doing two key exchanges in a
// row, ignore our own request for an
// initial kex if we have already sent
// it out.
if firstSent && requestFirst {
continue
}
}
if !sent {
@ -255,6 +270,7 @@ write:
t.recordWriteError(err)
break
}
firstSent = true
sent = true
}
}
@ -279,7 +295,12 @@ write:
t.writeError = err
t.sentInitPacket = nil
t.sentInitMsg = nil
t.writtenSinceKex = 0
t.writePacketsLeft = packetRekeyThreshold
if t.config.RekeyThreshold > 0 {
t.writeBytesLeft = int64(t.config.RekeyThreshold)
} else if t.algorithms != nil {
t.writeBytesLeft = t.algorithms.w.rekeyBytes()
}
request.done <- t.writeError
// kex finished. Push packets that we received while
@ -293,7 +314,7 @@ write:
break
}
}
t.pendingPackets = t.pendingPackets[0:]
t.pendingPackets = t.pendingPackets[:0]
t.mu.Unlock()
}
@ -309,17 +330,31 @@ write:
t.conn.Close()
}
func (t *handshakeTransport) readOnePacket(first bool) ([]byte, error) {
if t.readSinceKex > t.config.RekeyThreshold {
t.requestKeyExchange()
}
// The protocol uses uint32 for packet counters, so we can't let them
// reach 1<<32. We will actually read and write more packets than
// this, though: the other side may send more packets, and after we
// hit this limit on writing we will send a few more packets for the
// key exchange itself.
const packetRekeyThreshold = (1 << 31)
func (t *handshakeTransport) readOnePacket(first bool) ([]byte, error) {
p, err := t.conn.readPacket()
if err != nil {
return nil, err
}
t.readSinceKex += uint64(len(p))
if t.readPacketsLeft > 0 {
t.readPacketsLeft--
} else {
t.requestKeyExchange()
}
if t.readBytesLeft > 0 {
t.readBytesLeft -= int64(len(p))
} else {
t.requestKeyExchange()
}
if debugHandshake {
t.printPacket(p, false)
}
@ -349,7 +384,12 @@ func (t *handshakeTransport) readOnePacket(first bool) ([]byte, error) {
return nil, err
}
t.readSinceKex = 0
t.readPacketsLeft = packetRekeyThreshold
if t.config.RekeyThreshold > 0 {
t.readBytesLeft = int64(t.config.RekeyThreshold)
} else {
t.readBytesLeft = t.algorithms.r.rekeyBytes()
}
// By default, a key exchange is hidden from higher layers by
// translating it into msgIgnore.
@ -432,8 +472,16 @@ func (t *handshakeTransport) writePacket(p []byte) error {
t.pendingPackets = append(t.pendingPackets, cp)
return nil
}
t.writtenSinceKex += uint64(len(p))
if t.writtenSinceKex > t.config.RekeyThreshold {
if t.writeBytesLeft > 0 {
t.writeBytesLeft -= int64(len(p))
} else {
t.requestKeyExchange()
}
if t.writePacketsLeft > 0 {
t.writePacketsLeft--
} else {
t.requestKeyExchange()
}
@ -474,7 +522,8 @@ func (t *handshakeTransport) enterKeyExchange(otherInitPacket []byte) error {
magics.serverKexInit = otherInitPacket
}
algs, err := findAgreedAlgorithms(clientInit, serverInit)
var err error
t.algorithms, err = findAgreedAlgorithms(clientInit, serverInit)
if err != nil {
return err
}
@ -497,16 +546,16 @@ func (t *handshakeTransport) enterKeyExchange(otherInitPacket []byte) error {
}
}
kex, ok := kexAlgoMap[algs.kex]
kex, ok := kexAlgoMap[t.algorithms.kex]
if !ok {
return fmt.Errorf("ssh: unexpected key exchange algorithm %v", algs.kex)
return fmt.Errorf("ssh: unexpected key exchange algorithm %v", t.algorithms.kex)
}
var result *kexResult
if len(t.hostKeys) > 0 {
result, err = t.server(kex, algs, &magics)
result, err = t.server(kex, t.algorithms, &magics)
} else {
result, err = t.client(kex, algs, &magics)
result, err = t.client(kex, t.algorithms, &magics)
}
if err != nil {
@ -518,7 +567,7 @@ func (t *handshakeTransport) enterKeyExchange(otherInitPacket []byte) error {
}
result.SessionID = t.sessionID
t.conn.prepareKeyChange(algs, result)
t.conn.prepareKeyChange(t.algorithms, result)
if err = t.conn.writePacket([]byte{msgNewKeys}); err != nil {
return err
}

View File

@ -10,6 +10,7 @@ import (
"fmt"
"io"
"net"
"strings"
)
// The Permissions type holds fine-grained permissions that are
@ -231,7 +232,7 @@ func isAcceptableAlgo(algo string) bool {
return false
}
func checkSourceAddress(addr net.Addr, sourceAddr string) error {
func checkSourceAddress(addr net.Addr, sourceAddrs string) error {
if addr == nil {
return errors.New("ssh: no address known for client, but source-address match required")
}
@ -241,18 +242,20 @@ func checkSourceAddress(addr net.Addr, sourceAddr string) error {
return fmt.Errorf("ssh: remote address %v is not an TCP address when checking source-address match", addr)
}
if allowedIP := net.ParseIP(sourceAddr); allowedIP != nil {
if allowedIP.Equal(tcpAddr.IP) {
return nil
}
} else {
_, ipNet, err := net.ParseCIDR(sourceAddr)
if err != nil {
return fmt.Errorf("ssh: error parsing source-address restriction %q: %v", sourceAddr, err)
}
for _, sourceAddr := range strings.Split(sourceAddrs, ",") {
if allowedIP := net.ParseIP(sourceAddr); allowedIP != nil {
if allowedIP.Equal(tcpAddr.IP) {
return nil
}
} else {
_, ipNet, err := net.ParseCIDR(sourceAddr)
if err != nil {
return fmt.Errorf("ssh: error parsing source-address restriction %q: %v", sourceAddr, err)
}
if ipNet.Contains(tcpAddr.IP) {
return nil
if ipNet.Contains(tcpAddr.IP) {
return nil
}
}
}

View File

@ -8,8 +8,13 @@ import (
"bufio"
"errors"
"io"
"log"
)
// debugTransport if set, will print packet types as they go over the
// wire. No message decoding is done, to minimize the impact on timing.
const debugTransport = false
const (
gcmCipherID = "aes128-gcm@openssh.com"
aes128cbcID = "aes128-cbc"
@ -40,7 +45,7 @@ type transport struct {
bufReader *bufio.Reader
bufWriter *bufio.Writer
rand io.Reader
isClient bool
io.Closer
}
@ -86,6 +91,22 @@ func (t *transport) prepareKeyChange(algs *algorithms, kexResult *kexResult) err
return nil
}
func (t *transport) printPacket(p []byte, write bool) {
if len(p) == 0 {
return
}
who := "server"
if t.isClient {
who = "client"
}
what := "read"
if write {
what = "write"
}
log.Println(what, who, p[0])
}
// Read and decrypt next packet.
func (t *transport) readPacket() (p []byte, err error) {
for {
@ -97,6 +118,9 @@ func (t *transport) readPacket() (p []byte, err error) {
break
}
}
if debugTransport {
t.printPacket(p, false)
}
return p, err
}
@ -141,6 +165,9 @@ func (s *connectionState) readPacket(r *bufio.Reader) ([]byte, error) {
}
func (t *transport) writePacket(packet []byte) error {
if debugTransport {
t.printPacket(packet, true)
}
return t.writer.writePacket(t.bufWriter, t.rand, packet)
}
@ -181,6 +208,8 @@ func newTransport(rwc io.ReadWriteCloser, rand io.Reader, isClient bool) *transp
},
Closer: rwc,
}
t.isClient = isClient
if isClient {
t.reader.dir = serverKeys
t.writer.dir = clientKeys

View File

@ -7,7 +7,7 @@
// and between processes.
//
// Incoming requests to a server should create a Context, and outgoing calls to
// servers should accept a Context. The chain of function calls between must
// servers should accept a Context. The chain of function calls between must
// propagate the Context, optionally replacing it with a modified copy created
// using WithDeadline, WithTimeout, WithCancel, or WithValue.
//
@ -16,14 +16,14 @@
// propagation:
//
// Do not store Contexts inside a struct type; instead, pass a Context
// explicitly to each function that needs it. The Context should be the first
// explicitly to each function that needs it. The Context should be the first
// parameter, typically named ctx:
//
// func DoSomething(ctx context.Context, arg Arg) error {
// // ... use ctx ...
// }
//
// Do not pass a nil Context, even if a function permits it. Pass context.TODO
// Do not pass a nil Context, even if a function permits it. Pass context.TODO
// if you are unsure about which Context to use.
//
// Use context Values only for request-scoped data that transits processes and
@ -44,13 +44,13 @@ import "time"
// Context's methods may be called by multiple goroutines simultaneously.
type Context interface {
// Deadline returns the time when work done on behalf of this context
// should be canceled. Deadline returns ok==false when no deadline is
// set. Successive calls to Deadline return the same results.
// should be canceled. Deadline returns ok==false when no deadline is
// set. Successive calls to Deadline return the same results.
Deadline() (deadline time.Time, ok bool)
// Done returns a channel that's closed when work done on behalf of this
// context should be canceled. Done may return nil if this context can
// never be canceled. Successive calls to Done return the same value.
// context should be canceled. Done may return nil if this context can
// never be canceled. Successive calls to Done return the same value.
//
// WithCancel arranges for Done to be closed when cancel is called;
// WithDeadline arranges for Done to be closed when the deadline
@ -79,24 +79,24 @@ type Context interface {
// a Done channel for cancelation.
Done() <-chan struct{}
// Err returns a non-nil error value after Done is closed. Err returns
// Err returns a non-nil error value after Done is closed. Err returns
// Canceled if the context was canceled or DeadlineExceeded if the
// context's deadline passed. No other values for Err are defined.
// context's deadline passed. No other values for Err are defined.
// After Done is closed, successive calls to Err return the same value.
Err() error
// Value returns the value associated with this context for key, or nil
// if no value is associated with key. Successive calls to Value with
// if no value is associated with key. Successive calls to Value with
// the same key returns the same result.
//
// Use context values only for request-scoped data that transits
// processes and API boundaries, not for passing optional parameters to
// functions.
//
// A key identifies a specific value in a Context. Functions that wish
// A key identifies a specific value in a Context. Functions that wish
// to store values in Context typically allocate a key in a global
// variable then use that key as the argument to context.WithValue and
// Context.Value. A key can be any type that supports equality;
// Context.Value. A key can be any type that supports equality;
// packages should define keys as an unexported type to avoid
// collisions.
//
@ -115,7 +115,7 @@ type Context interface {
// // This prevents collisions with keys defined in other packages.
// type key int
//
// // userKey is the key for user.User values in Contexts. It is
// // userKey is the key for user.User values in Contexts. It is
// // unexported; clients use user.NewContext and user.FromContext
// // instead of using this key directly.
// var userKey key = 0
@ -134,14 +134,14 @@ type Context interface {
}
// Background returns a non-nil, empty Context. It is never canceled, has no
// values, and has no deadline. It is typically used by the main function,
// values, and has no deadline. It is typically used by the main function,
// initialization, and tests, and as the top-level Context for incoming
// requests.
func Background() Context {
return background
}
// TODO returns a non-nil, empty Context. Code should use context.TODO when
// TODO returns a non-nil, empty Context. Code should use context.TODO when
// it's unclear which Context to use or it is not yet available (because the
// surrounding function has not yet been extended to accept a Context
// parameter). TODO is recognized by static analysis tools that determine

View File

@ -35,8 +35,8 @@ func WithCancel(parent Context) (ctx Context, cancel CancelFunc) {
}
// WithDeadline returns a copy of the parent context with the deadline adjusted
// to be no later than d. If the parent's deadline is already earlier than d,
// WithDeadline(parent, d) is semantically equivalent to parent. The returned
// to be no later than d. If the parent's deadline is already earlier than d,
// WithDeadline(parent, d) is semantically equivalent to parent. The returned
// context's Done channel is closed when the deadline expires, when the returned
// cancel function is called, or when the parent context's Done channel is
// closed, whichever happens first.

View File

@ -13,7 +13,7 @@ import (
"time"
)
// An emptyCtx is never canceled, has no values, and has no deadline. It is not
// An emptyCtx is never canceled, has no values, and has no deadline. It is not
// struct{}, since vars of this type must have distinct addresses.
type emptyCtx int
@ -104,7 +104,7 @@ func propagateCancel(parent Context, child canceler) {
}
// parentCancelCtx follows a chain of parent references until it finds a
// *cancelCtx. This function understands how each of the concrete types in this
// *cancelCtx. This function understands how each of the concrete types in this
// package represents its parent.
func parentCancelCtx(parent Context) (*cancelCtx, bool) {
for {
@ -134,14 +134,14 @@ func removeChild(parent Context, child canceler) {
p.mu.Unlock()
}
// A canceler is a context type that can be canceled directly. The
// A canceler is a context type that can be canceled directly. The
// implementations are *cancelCtx and *timerCtx.
type canceler interface {
cancel(removeFromParent bool, err error)
Done() <-chan struct{}
}
// A cancelCtx can be canceled. When canceled, it also cancels any children
// A cancelCtx can be canceled. When canceled, it also cancels any children
// that implement canceler.
type cancelCtx struct {
Context
@ -193,8 +193,8 @@ func (c *cancelCtx) cancel(removeFromParent bool, err error) {
}
// WithDeadline returns a copy of the parent context with the deadline adjusted
// to be no later than d. If the parent's deadline is already earlier than d,
// WithDeadline(parent, d) is semantically equivalent to parent. The returned
// to be no later than d. If the parent's deadline is already earlier than d,
// WithDeadline(parent, d) is semantically equivalent to parent. The returned
// context's Done channel is closed when the deadline expires, when the returned
// cancel function is called, or when the parent context's Done channel is
// closed, whichever happens first.
@ -226,8 +226,8 @@ func WithDeadline(parent Context, deadline time.Time) (Context, CancelFunc) {
return c, func() { c.cancel(true, Canceled) }
}
// A timerCtx carries a timer and a deadline. It embeds a cancelCtx to
// implement Done and Err. It implements cancel by stopping its timer then
// A timerCtx carries a timer and a deadline. It embeds a cancelCtx to
// implement Done and Err. It implements cancel by stopping its timer then
// delegating to cancelCtx.cancel.
type timerCtx struct {
*cancelCtx
@ -281,7 +281,7 @@ func WithValue(parent Context, key interface{}, val interface{}) Context {
return &valueCtx{parent, key, val}
}
// A valueCtx carries a key-value pair. It implements Value for that key and
// A valueCtx carries a key-value pair. It implements Value for that key and
// delegates all other calls to the embedded Context.
type valueCtx struct {
Context

View File

@ -247,7 +247,7 @@ func filterOutClientConn(in []*ClientConn, exclude *ClientConn) []*ClientConn {
}
// noDialClientConnPool is an implementation of http2.ClientConnPool
// which never dials. We let the HTTP/1.1 client dial and use its TLS
// which never dials. We let the HTTP/1.1 client dial and use its TLS
// connection instead.
type noDialClientConnPool struct{ *clientConnPool }

View File

@ -312,7 +312,7 @@ type Framer struct {
MaxHeaderListSize uint32
// TODO: track which type of frame & with which flags was sent
// last. Then return an error (unless AllowIllegalWrites) if
// last. Then return an error (unless AllowIllegalWrites) if
// we're in the middle of a header block and a
// non-Continuation or Continuation on a different stream is
// attempted to be written.
@ -600,6 +600,7 @@ var (
errStreamID = errors.New("invalid stream ID")
errDepStreamID = errors.New("invalid dependent stream ID")
errPadLength = errors.New("pad length too large")
errPadBytes = errors.New("padding bytes must all be zeros unless AllowIllegalWrites is enabled")
)
func validStreamIDOrZero(streamID uint32) bool {
@ -623,6 +624,7 @@ func (f *Framer) WriteData(streamID uint32, endStream bool, data []byte) error {
//
// If pad is nil, the padding bit is not sent.
// The length of pad must not exceed 255 bytes.
// The bytes of pad must all be zero, unless f.AllowIllegalWrites is set.
//
// It will perform exactly one Write to the underlying Writer.
// It is the caller's responsibility not to violate the maximum frame size
@ -631,8 +633,18 @@ func (f *Framer) WriteDataPadded(streamID uint32, endStream bool, data, pad []by
if !validStreamID(streamID) && !f.AllowIllegalWrites {
return errStreamID
}
if len(pad) > 255 {
return errPadLength
if len(pad) > 0 {
if len(pad) > 255 {
return errPadLength
}
if !f.AllowIllegalWrites {
for _, b := range pad {
if b != 0 {
// "Padding octets MUST be set to zero when sending."
return errPadBytes
}
}
}
}
var flags Flags
if endStream {
@ -663,7 +675,7 @@ type SettingsFrame struct {
func parseSettingsFrame(fh FrameHeader, p []byte) (Frame, error) {
if fh.Flags.Has(FlagSettingsAck) && fh.Length > 0 {
// When this (ACK 0x1) bit is set, the payload of the
// SETTINGS frame MUST be empty. Receipt of a
// SETTINGS frame MUST be empty. Receipt of a
// SETTINGS frame with the ACK flag set and a length
// field value other than 0 MUST be treated as a
// connection error (Section 5.4.1) of type
@ -672,7 +684,7 @@ func parseSettingsFrame(fh FrameHeader, p []byte) (Frame, error) {
}
if fh.StreamID != 0 {
// SETTINGS frames always apply to a connection,
// never a single stream. The stream identifier for a
// never a single stream. The stream identifier for a
// SETTINGS frame MUST be zero (0x0). If an endpoint
// receives a SETTINGS frame whose stream identifier
// field is anything other than 0x0, the endpoint MUST
@ -923,7 +935,7 @@ func parseHeadersFrame(fh FrameHeader, p []byte) (_ Frame, err error) {
FrameHeader: fh,
}
if fh.StreamID == 0 {
// HEADERS frames MUST be associated with a stream. If a HEADERS frame
// HEADERS frames MUST be associated with a stream. If a HEADERS frame
// is received whose stream identifier field is 0x0, the recipient MUST
// respond with a connection error (Section 5.4.1) of type
// PROTOCOL_ERROR.
@ -1045,7 +1057,7 @@ type PriorityParam struct {
Exclusive bool
// Weight is the stream's zero-indexed weight. It should be
// set together with StreamDep, or neither should be set. Per
// set together with StreamDep, or neither should be set. Per
// the spec, "Add one to the value to obtain a weight between
// 1 and 256."
Weight uint8

View File

@ -45,7 +45,7 @@ func NewEncoder(w io.Writer) *Encoder {
// WriteField encodes f into a single Write to e's underlying Writer.
// This function may also produce bytes for "Header Table Size Update"
// if necessary. If produced, it is done before encoding f.
// if necessary. If produced, it is done before encoding f.
func (e *Encoder) WriteField(f HeaderField) error {
e.buf = e.buf[:0]

View File

@ -61,7 +61,7 @@ func (hf HeaderField) String() string {
func (hf HeaderField) Size() uint32 {
// http://http2.github.io/http2-spec/compression.html#rfc.section.4.1
// "The size of the dynamic table is the sum of the size of
// its entries. The size of an entry is the sum of its name's
// its entries. The size of an entry is the sum of its name's
// length in octets (as defined in Section 5.2), its value's
// length in octets (see Section 5.2), plus 32. The size of
// an entry is calculated using the length of the name and
@ -307,7 +307,7 @@ func (d *Decoder) Write(p []byte) (n int, err error) {
err = d.parseHeaderFieldRepr()
if err == errNeedMore {
// Extra paranoia, making sure saveBuf won't
// get too large. All the varint and string
// get too large. All the varint and string
// reading code earlier should already catch
// overlong things and return ErrStringLength,
// but keep this as a last resort.

View File

@ -10,7 +10,7 @@ import (
"sync"
)
// pipe is a goroutine-safe io.Reader/io.Writer pair. It's like
// pipe is a goroutine-safe io.Reader/io.Writer pair. It's like
// io.Pipe except there are no PipeReader/PipeWriter halves, and the
// underlying buffer is an interface. (io.Pipe is always unbuffered)
type pipe struct {

View File

@ -710,7 +710,7 @@ func (sc *serverConn) serve() {
return
}
// Now that we've got the preface, get us out of the
// "StateNew" state. We can't go directly to idle, though.
// "StateNew" state. We can't go directly to idle, though.
// Active means we read some data and anticipate a request. We'll
// do another Active when we get a HEADERS frame.
sc.setConnState(http.StateActive)
@ -2103,8 +2103,8 @@ func (b *requestBody) Read(p []byte) (n int, err error) {
return
}
// responseWriter is the http.ResponseWriter implementation. It's
// intentionally small (1 pointer wide) to minimize garbage. The
// responseWriter is the http.ResponseWriter implementation. It's
// intentionally small (1 pointer wide) to minimize garbage. The
// responseWriterState pointer inside is zeroed at the end of a
// request (in handlerDone) and calls on the responseWriter thereafter
// simply crash (caller's mistake), but the much larger responseWriterState
@ -2278,7 +2278,7 @@ const TrailerPrefix = "Trailer:"
// says you SHOULD (but not must) predeclare any trailers in the
// header, the official ResponseWriter rules said trailers in Go must
// be predeclared, and then we reuse the same ResponseWriter.Header()
// map to mean both Headers and Trailers. When it's time to write the
// map to mean both Headers and Trailers. When it's time to write the
// Trailers, we pick out the fields of Headers that were declared as
// trailers. That worked for a while, until we found the first major
// user of Trailers in the wild: gRPC (using them only over http2),

View File

@ -575,7 +575,7 @@ func (cc *ClientConn) canTakeNewRequestLocked() bool {
cc.nextStreamID < math.MaxInt32
}
// onIdleTimeout is called from a time.AfterFunc goroutine. It will
// onIdleTimeout is called from a time.AfterFunc goroutine. It will
// only be called when we're idle, but because we're coming from a new
// goroutine, there could be a new request coming in at the same time,
// so this simply calls the synchronized closeIfIdle to shut down this
@ -809,8 +809,8 @@ func (cc *ClientConn) RoundTrip(req *http.Request) (*http.Response, error) {
// 2xx, however, then assume the server DOES potentially
// want our body (e.g. full-duplex streaming:
// golang.org/issue/13444). If it turns out the server
// doesn't, they'll RST_STREAM us soon enough. This is a
// heuristic to avoid adding knobs to Transport. Hopefully
// doesn't, they'll RST_STREAM us soon enough. This is a
// heuristic to avoid adding knobs to Transport. Hopefully
// we can keep it.
bodyWriter.cancel()
cs.abortRequestBodyWrite(errStopReqBodyWrite)

View File

@ -371,7 +371,7 @@ func (ts *timeSeries) ComputeRange(start, finish time.Time, num int) []Observabl
}
}
// Failed to find a level that covers the desired range. So just
// Failed to find a level that covers the desired range. So just
// extract from the last level, even if it doesn't cover the entire
// desired range.
ts.extract(ts.levels[len(ts.levels)-1], start, finish, num, results)

View File

@ -486,17 +486,17 @@ type MethodConfig struct {
// then the other will be used. If neither is set, then the RPC has no deadline.
Timeout time.Duration
// MaxReqSize is the maximum allowed payload size for an individual request in a
// stream (client->server) in bytes. The size which is measured is the serialized,
// uncompressed payload in bytes. The actual value used is the minumum of the value
// specified here and the value set by the application via the gRPC client API. If
// either one is not set, then the other will be used. If neither is set, then the
// built-in default is used.
// stream (client->server) in bytes. The size which is measured is the serialized
// payload after per-message compression (but before stream compression) in bytes.
// The actual value used is the minumum of the value specified here and the value set
// by the application via the gRPC client API. If either one is not set, then the other
// will be used. If neither is set, then the built-in default is used.
// TODO: support this.
MaxReqSize uint64
MaxReqSize uint32
// MaxRespSize is the maximum allowed payload size for an individual response in a
// stream (server->client) in bytes.
// TODO: support this.
MaxRespSize uint64
MaxRespSize uint32
}
// ServiceConfig is provided by the service provider and contains parameters for how

474
vendor/vendor.json vendored
View File

@ -21,26 +21,26 @@
{
"checksumSHA1": "ZLRh6zW4/DnVsGpgtt+ZiIaEFKc=",
"path": "cloud.google.com/go/compute/metadata",
"revision": "2fad13a91cc5c2c321b67c95ca1e9ce123ebf5ac",
"revisionTime": "2017-01-26T23:44:27Z"
"revision": "3258e6905e9694db9bcd41910c65ecc30ae6dbbe",
"revisionTime": "2017-01-20T22:28:28Z"
},
{
"checksumSHA1": "4iounbuF7SMZdx/MlKSUuhnV848=",
"path": "cloud.google.com/go/internal",
"revision": "2fad13a91cc5c2c321b67c95ca1e9ce123ebf5ac",
"revisionTime": "2017-01-26T23:44:27Z"
"revision": "3258e6905e9694db9bcd41910c65ecc30ae6dbbe",
"revisionTime": "2017-01-20T22:28:28Z"
},
{
"checksumSHA1": "W2xJ0+fvugRhRi1PMi64bYofBbU=",
"path": "cloud.google.com/go/internal/optional",
"revision": "2fad13a91cc5c2c321b67c95ca1e9ce123ebf5ac",
"revisionTime": "2017-01-26T23:44:27Z"
"revision": "3258e6905e9694db9bcd41910c65ecc30ae6dbbe",
"revisionTime": "2017-01-20T22:28:28Z"
},
{
"checksumSHA1": "qBDDOQVU1mGqC4sbqo9AEtj5lRc=",
"path": "cloud.google.com/go/storage",
"revision": "2fad13a91cc5c2c321b67c95ca1e9ce123ebf5ac",
"revisionTime": "2017-01-26T23:44:27Z"
"revision": "3258e6905e9694db9bcd41910c65ecc30ae6dbbe",
"revisionTime": "2017-01-20T22:28:28Z"
},
{
"checksumSHA1": "oLyqboCUn++vuun/CUmQqAGInTY=",
@ -115,196 +115,196 @@
"revisionTime": "2017-01-04T21:11:26Z"
},
{
"checksumSHA1": "kcsjlfTPj8XeL81Eqan6FEOrFjg=",
"checksumSHA1": "CBkrMzvLXmGD/guNcRCzPHTO66c=",
"path": "github.com/aws/aws-sdk-go/aws",
"revision": "5f8c77604d405643d9bd8440d47b57bc40748824",
"revisionTime": "2017-01-26T00:38:53Z"
"revision": "7524cb911daddd6e5c9195def8e59ae892bef8d9",
"revisionTime": "2017-01-31T21:21:33Z"
},
{
"checksumSHA1": "Y9W+4GimK4Fuxq+vyIskVYFRnX4=",
"path": "github.com/aws/aws-sdk-go/aws/awserr",
"revision": "5f8c77604d405643d9bd8440d47b57bc40748824",
"revisionTime": "2017-01-26T00:38:53Z"
"revision": "7524cb911daddd6e5c9195def8e59ae892bef8d9",
"revisionTime": "2017-01-31T21:21:33Z"
},
{
"checksumSHA1": "yyYr41HZ1Aq0hWc3J5ijXwYEcac=",
"path": "github.com/aws/aws-sdk-go/aws/awsutil",
"revision": "5f8c77604d405643d9bd8440d47b57bc40748824",
"revisionTime": "2017-01-26T00:38:53Z"
"revision": "7524cb911daddd6e5c9195def8e59ae892bef8d9",
"revisionTime": "2017-01-31T21:21:33Z"
},
{
"checksumSHA1": "7cQU8tU9hBgsG23XZmko1GePqjQ=",
"path": "github.com/aws/aws-sdk-go/aws/client",
"revision": "5f8c77604d405643d9bd8440d47b57bc40748824",
"revisionTime": "2017-01-26T00:38:53Z"
"revision": "7524cb911daddd6e5c9195def8e59ae892bef8d9",
"revisionTime": "2017-01-31T21:21:33Z"
},
{
"checksumSHA1": "ieAJ+Cvp/PKv1LpUEnUXpc3OI6E=",
"path": "github.com/aws/aws-sdk-go/aws/client/metadata",
"revision": "5f8c77604d405643d9bd8440d47b57bc40748824",
"revisionTime": "2017-01-26T00:38:53Z"
"revision": "7524cb911daddd6e5c9195def8e59ae892bef8d9",
"revisionTime": "2017-01-31T21:21:33Z"
},
{
"checksumSHA1": "Fl8vRSCY0MbM04cmiz/0MID+goA=",
"path": "github.com/aws/aws-sdk-go/aws/corehandlers",
"revision": "5f8c77604d405643d9bd8440d47b57bc40748824",
"revisionTime": "2017-01-26T00:38:53Z"
"revision": "7524cb911daddd6e5c9195def8e59ae892bef8d9",
"revisionTime": "2017-01-31T21:21:33Z"
},
{
"checksumSHA1": "zu5C95rmCZff6NYZb62lEaT5ibE=",
"path": "github.com/aws/aws-sdk-go/aws/credentials",
"revision": "5f8c77604d405643d9bd8440d47b57bc40748824",
"revisionTime": "2017-01-26T00:38:53Z"
"revision": "7524cb911daddd6e5c9195def8e59ae892bef8d9",
"revisionTime": "2017-01-31T21:21:33Z"
},
{
"checksumSHA1": "u3GOAJLmdvbuNUeUEcZSEAOeL/0=",
"path": "github.com/aws/aws-sdk-go/aws/credentials/ec2rolecreds",
"revision": "5f8c77604d405643d9bd8440d47b57bc40748824",
"revisionTime": "2017-01-26T00:38:53Z"
"revision": "7524cb911daddd6e5c9195def8e59ae892bef8d9",
"revisionTime": "2017-01-31T21:21:33Z"
},
{
"checksumSHA1": "NUJUTWlc1sV8b7WjfiYc4JZbXl0=",
"path": "github.com/aws/aws-sdk-go/aws/credentials/endpointcreds",
"revision": "5f8c77604d405643d9bd8440d47b57bc40748824",
"revisionTime": "2017-01-26T00:38:53Z"
"revision": "7524cb911daddd6e5c9195def8e59ae892bef8d9",
"revisionTime": "2017-01-31T21:21:33Z"
},
{
"checksumSHA1": "4Ipx+5xN0gso+cENC2MHMWmQlR4=",
"path": "github.com/aws/aws-sdk-go/aws/credentials/stscreds",
"revision": "5f8c77604d405643d9bd8440d47b57bc40748824",
"revisionTime": "2017-01-26T00:38:53Z"
"revision": "7524cb911daddd6e5c9195def8e59ae892bef8d9",
"revisionTime": "2017-01-31T21:21:33Z"
},
{
"checksumSHA1": "lqh3fG7wCochvB4iHAZJuhhEJW0=",
"path": "github.com/aws/aws-sdk-go/aws/defaults",
"revision": "5f8c77604d405643d9bd8440d47b57bc40748824",
"revisionTime": "2017-01-26T00:38:53Z"
"revision": "7524cb911daddd6e5c9195def8e59ae892bef8d9",
"revisionTime": "2017-01-31T21:21:33Z"
},
{
"checksumSHA1": "/EXbk/z2TWjWc1Hvb4QYs3Wmhb8=",
"path": "github.com/aws/aws-sdk-go/aws/ec2metadata",
"revision": "5f8c77604d405643d9bd8440d47b57bc40748824",
"revisionTime": "2017-01-26T00:38:53Z"
"revision": "7524cb911daddd6e5c9195def8e59ae892bef8d9",
"revisionTime": "2017-01-31T21:21:33Z"
},
{
"checksumSHA1": "IOFLZi8jpN+LOQIvMgHqIDGxG50=",
"path": "github.com/aws/aws-sdk-go/aws/endpoints",
"revision": "5f8c77604d405643d9bd8440d47b57bc40748824",
"revisionTime": "2017-01-26T00:38:53Z"
"revision": "7524cb911daddd6e5c9195def8e59ae892bef8d9",
"revisionTime": "2017-01-31T21:21:33Z"
},
{
"checksumSHA1": "M78rTxU55Qagqr3MYj91im2031E=",
"path": "github.com/aws/aws-sdk-go/aws/request",
"revision": "5f8c77604d405643d9bd8440d47b57bc40748824",
"revisionTime": "2017-01-26T00:38:53Z"
"revision": "7524cb911daddd6e5c9195def8e59ae892bef8d9",
"revisionTime": "2017-01-31T21:21:33Z"
},
{
"checksumSHA1": "/qrYhYWKtQA7Rxthy4YP8EnfIn8=",
"path": "github.com/aws/aws-sdk-go/aws/session",
"revision": "5f8c77604d405643d9bd8440d47b57bc40748824",
"revisionTime": "2017-01-26T00:38:53Z"
"revision": "7524cb911daddd6e5c9195def8e59ae892bef8d9",
"revisionTime": "2017-01-31T21:21:33Z"
},
{
"checksumSHA1": "0FvPLvkBUpTElfUc/FZtPsJfuV0=",
"path": "github.com/aws/aws-sdk-go/aws/signer/v4",
"revision": "5f8c77604d405643d9bd8440d47b57bc40748824",
"revisionTime": "2017-01-26T00:38:53Z"
"revision": "7524cb911daddd6e5c9195def8e59ae892bef8d9",
"revisionTime": "2017-01-31T21:21:33Z"
},
{
"checksumSHA1": "wk7EyvDaHwb5qqoOP/4d3cV0708=",
"path": "github.com/aws/aws-sdk-go/private/protocol",
"revision": "5f8c77604d405643d9bd8440d47b57bc40748824",
"revisionTime": "2017-01-26T00:38:53Z"
"revision": "7524cb911daddd6e5c9195def8e59ae892bef8d9",
"revisionTime": "2017-01-31T21:21:33Z"
},
{
"checksumSHA1": "1QmQ3FqV37w0Zi44qv8pA1GeR0A=",
"path": "github.com/aws/aws-sdk-go/private/protocol/ec2query",
"revision": "5f8c77604d405643d9bd8440d47b57bc40748824",
"revisionTime": "2017-01-26T00:38:53Z"
"revision": "7524cb911daddd6e5c9195def8e59ae892bef8d9",
"revisionTime": "2017-01-31T21:21:33Z"
},
{
"checksumSHA1": "ZVReWkb98VVOWIl64qW9qwGcE7k=",
"path": "github.com/aws/aws-sdk-go/private/protocol/json/jsonutil",
"revision": "5f8c77604d405643d9bd8440d47b57bc40748824",
"revisionTime": "2017-01-26T00:38:53Z"
"revision": "7524cb911daddd6e5c9195def8e59ae892bef8d9",
"revisionTime": "2017-01-31T21:21:33Z"
},
{
"checksumSHA1": "R00RL5jJXRYq1iiK1+PGvMfvXyM=",
"path": "github.com/aws/aws-sdk-go/private/protocol/jsonrpc",
"revision": "5f8c77604d405643d9bd8440d47b57bc40748824",
"revisionTime": "2017-01-26T00:38:53Z"
"revision": "7524cb911daddd6e5c9195def8e59ae892bef8d9",
"revisionTime": "2017-01-31T21:21:33Z"
},
{
"checksumSHA1": "ZqY5RWavBLWTo6j9xqdyBEaNFRk=",
"path": "github.com/aws/aws-sdk-go/private/protocol/query",
"revision": "5f8c77604d405643d9bd8440d47b57bc40748824",
"revisionTime": "2017-01-26T00:38:53Z"
"revision": "7524cb911daddd6e5c9195def8e59ae892bef8d9",
"revisionTime": "2017-01-31T21:21:33Z"
},
{
"checksumSHA1": "hqTEmgtchF9SwVTW0IQId2eLUKM=",
"path": "github.com/aws/aws-sdk-go/private/protocol/query/queryutil",
"revision": "5f8c77604d405643d9bd8440d47b57bc40748824",
"revisionTime": "2017-01-26T00:38:53Z"
"revision": "7524cb911daddd6e5c9195def8e59ae892bef8d9",
"revisionTime": "2017-01-31T21:21:33Z"
},
{
"checksumSHA1": "szZSLm3BlYkL3vqlZhNAlYk8iwM=",
"path": "github.com/aws/aws-sdk-go/private/protocol/rest",
"revision": "5f8c77604d405643d9bd8440d47b57bc40748824",
"revisionTime": "2017-01-26T00:38:53Z"
"revision": "7524cb911daddd6e5c9195def8e59ae892bef8d9",
"revisionTime": "2017-01-31T21:21:33Z"
},
{
"checksumSHA1": "ODo+ko8D6unAxZuN1jGzMcN4QCc=",
"path": "github.com/aws/aws-sdk-go/private/protocol/restxml",
"revision": "5f8c77604d405643d9bd8440d47b57bc40748824",
"revisionTime": "2017-01-26T00:38:53Z"
"revision": "7524cb911daddd6e5c9195def8e59ae892bef8d9",
"revisionTime": "2017-01-31T21:21:33Z"
},
{
"checksumSHA1": "lZ1z4xAbT8euCzKoAsnEYic60VE=",
"path": "github.com/aws/aws-sdk-go/private/protocol/xml/xmlutil",
"revision": "5f8c77604d405643d9bd8440d47b57bc40748824",
"revisionTime": "2017-01-26T00:38:53Z"
"revision": "7524cb911daddd6e5c9195def8e59ae892bef8d9",
"revisionTime": "2017-01-31T21:21:33Z"
},
{
"checksumSHA1": "Eo9yODN5U99BK0pMzoqnBm7PCrY=",
"path": "github.com/aws/aws-sdk-go/private/waiter",
"revision": "5f8c77604d405643d9bd8440d47b57bc40748824",
"revisionTime": "2017-01-26T00:38:53Z"
"revision": "7524cb911daddd6e5c9195def8e59ae892bef8d9",
"revisionTime": "2017-01-31T21:21:33Z"
},
{
"checksumSHA1": "dazzJPyvMaO0oAgP5NhKZ6I9qpE=",
"checksumSHA1": "nz8TKu6v2dXW8kvHln2VguNmUuw=",
"path": "github.com/aws/aws-sdk-go/service/dynamodb",
"revision": "5f8c77604d405643d9bd8440d47b57bc40748824",
"revisionTime": "2017-01-26T00:38:53Z"
"revision": "7524cb911daddd6e5c9195def8e59ae892bef8d9",
"revisionTime": "2017-01-31T21:21:33Z"
},
{
"checksumSHA1": "JO4oie1uPoST8lsP4iWbHlOkVZc=",
"path": "github.com/aws/aws-sdk-go/service/dynamodb/dynamodbattribute",
"revision": "5f8c77604d405643d9bd8440d47b57bc40748824",
"revisionTime": "2017-01-26T00:38:53Z"
"revision": "7524cb911daddd6e5c9195def8e59ae892bef8d9",
"revisionTime": "2017-01-31T21:21:33Z"
},
{
"checksumSHA1": "DWhbR96d4Vl80WSAfbausUEs6Cc=",
"checksumSHA1": "uCGLl0X4oRuWBAeM59aTVI/gELs=",
"path": "github.com/aws/aws-sdk-go/service/ec2",
"revision": "5f8c77604d405643d9bd8440d47b57bc40748824",
"revisionTime": "2017-01-26T00:38:53Z"
"revision": "7524cb911daddd6e5c9195def8e59ae892bef8d9",
"revisionTime": "2017-01-31T21:21:33Z"
},
{
"checksumSHA1": "yaGpMDf20gnzeb87kNOraNMkOAM=",
"checksumSHA1": "vtaKEwBXDiWg000PcDBPbnOZEoY=",
"path": "github.com/aws/aws-sdk-go/service/iam",
"revision": "5f8c77604d405643d9bd8440d47b57bc40748824",
"revisionTime": "2017-01-26T00:38:53Z"
"revision": "7524cb911daddd6e5c9195def8e59ae892bef8d9",
"revisionTime": "2017-01-31T21:21:33Z"
},
{
"checksumSHA1": "yeut1ZgvmDnjhSDTen7oKOtrfos=",
"checksumSHA1": "hh8Fw0ACTEA5ihWGYyw/jUdllFY=",
"path": "github.com/aws/aws-sdk-go/service/s3",
"revision": "5f8c77604d405643d9bd8440d47b57bc40748824",
"revisionTime": "2017-01-26T00:38:53Z"
"revision": "7524cb911daddd6e5c9195def8e59ae892bef8d9",
"revisionTime": "2017-01-31T21:21:33Z"
},
{
"checksumSHA1": "mTYnOiyBDqdeG6pBQi8FRbHO7Qg=",
"checksumSHA1": "Knj17ZMPWkGYTm2hZxEgnuboMM4=",
"path": "github.com/aws/aws-sdk-go/service/sts",
"revision": "5f8c77604d405643d9bd8440d47b57bc40748824",
"revisionTime": "2017-01-26T00:38:53Z"
"revision": "7524cb911daddd6e5c9195def8e59ae892bef8d9",
"revisionTime": "2017-01-31T21:21:33Z"
},
{
"checksumSHA1": "spyv5/YFBjYyZLZa1U2LBfDR8PM=",
@ -319,28 +319,28 @@
"revisionTime": "2016-10-13T10:26:35Z"
},
{
"checksumSHA1": "rZUZrr2N4vQHKqCX5jWXBrm/3og=",
"checksumSHA1": "R8vLE6DoLZoRjKz+KkdqVvRPmDY=",
"path": "github.com/circonus-labs/circonus-gometrics",
"revision": "c7840b7d09bc8f986650284f0f4b000e371c90a5",
"revisionTime": "2017-01-25T12:49:21Z"
"revision": "fb2909576d0526b70e3efa0ef10737b92f57f15a",
"revisionTime": "2017-02-01T21:08:33Z"
},
{
"checksumSHA1": "CpBTgaOJynaHwSrXLKvWWjCB5Kg=",
"checksumSHA1": "oEXgJ7z0zYOadJ43C08mpFU2Oe0=",
"path": "github.com/circonus-labs/circonus-gometrics/api",
"revision": "c7840b7d09bc8f986650284f0f4b000e371c90a5",
"revisionTime": "2017-01-25T12:49:21Z"
"revision": "fb2909576d0526b70e3efa0ef10737b92f57f15a",
"revisionTime": "2017-02-01T21:08:33Z"
},
{
"checksumSHA1": "bQhz/fcyZPmuHSH2qwC4ZtATy5c=",
"path": "github.com/circonus-labs/circonus-gometrics/api/config",
"revision": "c7840b7d09bc8f986650284f0f4b000e371c90a5",
"revisionTime": "2017-01-25T12:49:21Z"
"revision": "fb2909576d0526b70e3efa0ef10737b92f57f15a",
"revisionTime": "2017-02-01T21:08:33Z"
},
{
"checksumSHA1": "LId+Fpn/UArSKGvWhutmj19GuJk=",
"checksumSHA1": "6hvd+YFb1eWFkc3pVcnOPPa2OVw=",
"path": "github.com/circonus-labs/circonus-gometrics/checkmgr",
"revision": "c7840b7d09bc8f986650284f0f4b000e371c90a5",
"revisionTime": "2017-01-25T12:49:21Z"
"revision": "fb2909576d0526b70e3efa0ef10737b92f57f15a",
"revisionTime": "2017-02-01T21:08:33Z"
},
{
"checksumSHA1": "VbfeVqeOM+dTNxCmpvmYS0LwQn0=",
@ -351,80 +351,80 @@
{
"checksumSHA1": "7uspQtEpYuBxaxrBTcxa+ZfiuJo=",
"path": "github.com/coreos/etcd/auth/authpb",
"revision": "75ae50a90ff7772d9a5d96ba1b3fa0019829ea39",
"revisionTime": "2017-01-27T01:04:21Z"
"revision": "56c706ff916fc9706826901276601d0ecd7684b4",
"revisionTime": "2017-02-02T17:53:09Z"
},
{
"checksumSHA1": "Zgqp9pp3G4cSZbepa6tzhNeHZOI=",
"path": "github.com/coreos/etcd/client",
"revision": "75ae50a90ff7772d9a5d96ba1b3fa0019829ea39",
"revisionTime": "2017-01-27T01:04:21Z"
"revision": "56c706ff916fc9706826901276601d0ecd7684b4",
"revisionTime": "2017-02-02T17:53:09Z"
},
{
"checksumSHA1": "y6G5Pu2aqxa7KpvtWrzAXm8lMfI=",
"path": "github.com/coreos/etcd/clientv3",
"revision": "75ae50a90ff7772d9a5d96ba1b3fa0019829ea39",
"revisionTime": "2017-01-27T01:04:21Z"
"revision": "56c706ff916fc9706826901276601d0ecd7684b4",
"revisionTime": "2017-02-02T17:53:09Z"
},
{
"checksumSHA1": "VYHV9hcyZ0J8sUJyiD1xlddWTxA=",
"checksumSHA1": "tHT9JXi1O4YtDEJJTPMDwtyf8lQ=",
"path": "github.com/coreos/etcd/clientv3/concurrency",
"revision": "75ae50a90ff7772d9a5d96ba1b3fa0019829ea39",
"revisionTime": "2017-01-27T01:04:21Z"
"revision": "56c706ff916fc9706826901276601d0ecd7684b4",
"revisionTime": "2017-02-02T17:53:09Z"
},
{
"checksumSHA1": "lY/Ca8yCqHV9cv0BQU88br59VeI=",
"path": "github.com/coreos/etcd/etcdserver/api/v3rpc/rpctypes",
"revision": "75ae50a90ff7772d9a5d96ba1b3fa0019829ea39",
"revisionTime": "2017-01-27T01:04:21Z"
"revision": "56c706ff916fc9706826901276601d0ecd7684b4",
"revisionTime": "2017-02-02T17:53:09Z"
},
{
"checksumSHA1": "KtZXQeJEDvaMXiqxG1DKUw+BdJ8=",
"path": "github.com/coreos/etcd/etcdserver/etcdserverpb",
"revision": "75ae50a90ff7772d9a5d96ba1b3fa0019829ea39",
"revisionTime": "2017-01-27T01:04:21Z"
"revision": "56c706ff916fc9706826901276601d0ecd7684b4",
"revisionTime": "2017-02-02T17:53:09Z"
},
{
"checksumSHA1": "PAnQN6F8iZuIfu9HHOORyVFaaOA=",
"path": "github.com/coreos/etcd/mvcc/mvccpb",
"revision": "75ae50a90ff7772d9a5d96ba1b3fa0019829ea39",
"revisionTime": "2017-01-27T01:04:21Z"
"revision": "56c706ff916fc9706826901276601d0ecd7684b4",
"revisionTime": "2017-02-02T17:53:09Z"
},
{
"checksumSHA1": "ga3jt9r+dQBMSXG0gnpNcXp2xYA=",
"path": "github.com/coreos/etcd/pkg/fileutil",
"revision": "75ae50a90ff7772d9a5d96ba1b3fa0019829ea39",
"revisionTime": "2017-01-27T01:04:21Z"
"revision": "56c706ff916fc9706826901276601d0ecd7684b4",
"revisionTime": "2017-02-02T17:53:09Z"
},
{
"checksumSHA1": "mKIXx1kDwmVmdIpZ3pJtRBuUKso=",
"path": "github.com/coreos/etcd/pkg/pathutil",
"revision": "75ae50a90ff7772d9a5d96ba1b3fa0019829ea39",
"revisionTime": "2017-01-27T01:04:21Z"
"revision": "56c706ff916fc9706826901276601d0ecd7684b4",
"revisionTime": "2017-02-02T17:53:09Z"
},
{
"checksumSHA1": "rMyIh9PsSvPs6Yd+YgKITQzQJx8=",
"path": "github.com/coreos/etcd/pkg/tlsutil",
"revision": "75ae50a90ff7772d9a5d96ba1b3fa0019829ea39",
"revisionTime": "2017-01-27T01:04:21Z"
"revision": "56c706ff916fc9706826901276601d0ecd7684b4",
"revisionTime": "2017-02-02T17:53:09Z"
},
{
"checksumSHA1": "HBfN6B8eoiy/zsUr74DaRkcyFmg=",
"path": "github.com/coreos/etcd/pkg/transport",
"revision": "75ae50a90ff7772d9a5d96ba1b3fa0019829ea39",
"revisionTime": "2017-01-27T01:04:21Z"
"revision": "56c706ff916fc9706826901276601d0ecd7684b4",
"revisionTime": "2017-02-02T17:53:09Z"
},
{
"checksumSHA1": "gx1gJIMU6T0UNQ0bPZ/drQ8cpCI=",
"path": "github.com/coreos/etcd/pkg/types",
"revision": "75ae50a90ff7772d9a5d96ba1b3fa0019829ea39",
"revisionTime": "2017-01-27T01:04:21Z"
"revision": "56c706ff916fc9706826901276601d0ecd7684b4",
"revisionTime": "2017-02-02T17:53:09Z"
},
{
"checksumSHA1": "sp2FkEyaIGiQFOEZCTDkBZgyHOs=",
"path": "github.com/coreos/etcd/version",
"revision": "75ae50a90ff7772d9a5d96ba1b3fa0019829ea39",
"revisionTime": "2017-01-27T01:04:21Z"
"revision": "56c706ff916fc9706826901276601d0ecd7684b4",
"revisionTime": "2017-02-02T17:53:09Z"
},
{
"checksumSHA1": "butr+Orbf1fd1hcLqNXYwUDAjcI=",
@ -435,8 +435,8 @@
{
"checksumSHA1": "d50/+u/LFlXvEV10HiEoXB9OsGg=",
"path": "github.com/coreos/go-systemd/journal",
"revision": "7f737a6bd38784c73b5bf5cd54d9b1d23295e3a0",
"revisionTime": "2017-01-13T10:31:45Z"
"revision": "e97b35f834b17eaa82afe3d44715c34736bfa12b",
"revisionTime": "2017-02-01T10:47:36Z"
},
{
"checksumSHA1": "wqEybhAfMhCq2uOu4bT737mqu6U=",
@ -493,10 +493,10 @@
"revisionTime": "2017-01-23T09:11:46Z"
},
{
"checksumSHA1": "NJeFAnjnXVx102AUi4U30kOcm7w=",
"checksumSHA1": "ezktpcI0As/fZ0rN7BnBNtUfIsQ=",
"path": "github.com/go-ldap/ldap",
"revision": "61e5b9137f8e22cc191b23d94fd95ae9833aa4d5",
"revisionTime": "2016-12-22T14:10:51Z"
"revision": "931bf64d9da4d3d241757d12f1f1420b8605f6fa",
"revisionTime": "2017-02-02T15:09:24Z"
},
{
"checksumSHA1": "QD6LqgLz2JMxXqns8TaxtK9AuHs=",
@ -547,10 +547,10 @@
"revisionTime": "2017-01-19T01:47:23Z"
},
{
"checksumSHA1": "Um9voOUNeH3a1TILYjYRznmnUkE=",
"checksumSHA1": "FOxeg37aPc/WGqNu6V3mftTmma0=",
"path": "github.com/google/go-github/github",
"revision": "c9c37fd6ce0247943d1aa34fc3813c62c5cb0225",
"revisionTime": "2017-01-19T07:22:36Z"
"revision": "59aa6eea1c58ba063a0c3b90a16499cb39e6332a",
"revisionTime": "2017-02-02T16:55:40Z"
},
{
"checksumSHA1": "p3IB18uJRs4dL2K5yx24MrLYE9A=",
@ -573,20 +573,20 @@
{
"checksumSHA1": "CGKObIoG0JzwczJ9vOFtG0F93Nc=",
"path": "github.com/grpc-ecosystem/grpc-gateway/runtime",
"revision": "cfee3c5f91d8b8b54b216781e246443bb73b1a8e",
"revisionTime": "2017-01-25T18:34:50Z"
"revision": "686368427ddb9a51628d63db6c74fbc96a206e1f",
"revisionTime": "2017-01-27T20:12:19Z"
},
{
"checksumSHA1": "x396LPNfci/5x8aVJbliQHH11HQ=",
"path": "github.com/grpc-ecosystem/grpc-gateway/runtime/internal",
"revision": "cfee3c5f91d8b8b54b216781e246443bb73b1a8e",
"revisionTime": "2017-01-25T18:34:50Z"
"revision": "686368427ddb9a51628d63db6c74fbc96a206e1f",
"revisionTime": "2017-01-27T20:12:19Z"
},
{
"checksumSHA1": "vqiK5r5dntV7JNZ+ZsGlD0Samos=",
"path": "github.com/grpc-ecosystem/grpc-gateway/utilities",
"revision": "cfee3c5f91d8b8b54b216781e246443bb73b1a8e",
"revisionTime": "2017-01-25T18:34:50Z"
"revision": "686368427ddb9a51628d63db6c74fbc96a206e1f",
"revisionTime": "2017-01-27T20:12:19Z"
},
{
"checksumSHA1": "O0r0hj4YL+jSRNjnshkeH4GY+4s=",
@ -597,14 +597,14 @@
{
"checksumSHA1": "ygEjA1d52B1RDmZu8+1WTwkrYDQ=",
"path": "github.com/hashicorp/consul/api",
"revision": "1ca6c9bff33e93c18ac960be32ee84af03e602d1",
"revisionTime": "2017-01-26T23:38:03Z"
"revision": "01588efc2aece3346e34d4b15e7bab614092d60d",
"revisionTime": "2017-02-02T17:19:54Z"
},
{
"checksumSHA1": "HDRi8BjyCm/zCYGA8l/40GMuWN8=",
"path": "github.com/hashicorp/consul/lib",
"revision": "1ca6c9bff33e93c18ac960be32ee84af03e602d1",
"revisionTime": "2017-01-26T23:38:03Z"
"revision": "01588efc2aece3346e34d4b15e7bab614092d60d",
"revisionTime": "2017-02-02T17:19:54Z"
},
{
"checksumSHA1": "cdOCt0Yb+hdErz8NAQqayxPmRsY=",
@ -669,56 +669,56 @@
{
"checksumSHA1": "Ok3Csn6Voou7pQT6Dv2mkwpqFtw=",
"path": "github.com/hashicorp/hcl",
"revision": "db4f0768927a665a06c32855186e1bc762bcc8f5",
"revisionTime": "2017-01-25T01:06:35Z"
"revision": "372e8ddaa16fd67e371e9323807d056b799360af",
"revisionTime": "2017-02-02T00:05:34Z"
},
{
"checksumSHA1": "XQmjDva9JCGGkIecOgwtBEMCJhU=",
"path": "github.com/hashicorp/hcl/hcl/ast",
"revision": "db4f0768927a665a06c32855186e1bc762bcc8f5",
"revisionTime": "2017-01-25T01:06:35Z"
"revision": "372e8ddaa16fd67e371e9323807d056b799360af",
"revisionTime": "2017-02-02T00:05:34Z"
},
{
"checksumSHA1": "MPz4qnNmoYHHUXDhHj0TpJk4LHk=",
"checksumSHA1": "MGYzZActhzSs9AnCx3wrEYVbKFg=",
"path": "github.com/hashicorp/hcl/hcl/parser",
"revision": "db4f0768927a665a06c32855186e1bc762bcc8f5",
"revisionTime": "2017-01-25T01:06:35Z"
"revision": "372e8ddaa16fd67e371e9323807d056b799360af",
"revisionTime": "2017-02-02T00:05:34Z"
},
{
"checksumSHA1": "z6wdP4mRw4GVjShkNHDaOWkbxS0=",
"path": "github.com/hashicorp/hcl/hcl/scanner",
"revision": "db4f0768927a665a06c32855186e1bc762bcc8f5",
"revisionTime": "2017-01-25T01:06:35Z"
"revision": "372e8ddaa16fd67e371e9323807d056b799360af",
"revisionTime": "2017-02-02T00:05:34Z"
},
{
"checksumSHA1": "oS3SCN9Wd6D8/LG0Yx1fu84a7gI=",
"path": "github.com/hashicorp/hcl/hcl/strconv",
"revision": "db4f0768927a665a06c32855186e1bc762bcc8f5",
"revisionTime": "2017-01-25T01:06:35Z"
"revision": "372e8ddaa16fd67e371e9323807d056b799360af",
"revisionTime": "2017-02-02T00:05:34Z"
},
{
"checksumSHA1": "c6yprzj06ASwCo18TtbbNNBHljA=",
"path": "github.com/hashicorp/hcl/hcl/token",
"revision": "db4f0768927a665a06c32855186e1bc762bcc8f5",
"revisionTime": "2017-01-25T01:06:35Z"
"revision": "372e8ddaa16fd67e371e9323807d056b799360af",
"revisionTime": "2017-02-02T00:05:34Z"
},
{
"checksumSHA1": "138aCV5n8n7tkGYMsMVQQnnLq+0=",
"path": "github.com/hashicorp/hcl/json/parser",
"revision": "db4f0768927a665a06c32855186e1bc762bcc8f5",
"revisionTime": "2017-01-25T01:06:35Z"
"revision": "372e8ddaa16fd67e371e9323807d056b799360af",
"revisionTime": "2017-02-02T00:05:34Z"
},
{
"checksumSHA1": "YdvFsNOMSWMLnY6fcliWQa0O5Fw=",
"path": "github.com/hashicorp/hcl/json/scanner",
"revision": "db4f0768927a665a06c32855186e1bc762bcc8f5",
"revisionTime": "2017-01-25T01:06:35Z"
"revision": "372e8ddaa16fd67e371e9323807d056b799360af",
"revisionTime": "2017-02-02T00:05:34Z"
},
{
"checksumSHA1": "fNlXQCQEnb+B3k5UDL/r15xtSJY=",
"path": "github.com/hashicorp/hcl/json/token",
"revision": "db4f0768927a665a06c32855186e1bc762bcc8f5",
"revisionTime": "2017-01-25T01:06:35Z"
"revision": "372e8ddaa16fd67e371e9323807d056b799360af",
"revisionTime": "2017-02-02T00:05:34Z"
},
{
"checksumSHA1": "qnlqWJYV81ENr61SZk9c65R1mDo=",
@ -741,8 +741,8 @@
{
"checksumSHA1": "E3Xcanc9ouQwL+CZGOUyA/+giLg=",
"path": "github.com/hashicorp/serf/coordinate",
"revision": "d3a67ab21bc8a4643fa53a3633f2d951dd50c6ca",
"revisionTime": "2016-12-07T01:17:43Z"
"revision": "34e94dbd8faa991710b442c22ad6ad37c8b44c3b",
"revisionTime": "2017-02-02T01:56:25Z"
},
{
"checksumSHA1": "ZhK6IO2XN81Y+3RAjTcVm1Ic7oU=",
@ -817,16 +817,16 @@
"revisionTime": "2016-12-08T01:54:25Z"
},
{
"checksumSHA1": "tvimR1R9mxvCDSUxlnKgIXjJBus=",
"checksumSHA1": "dm3g5P1ezW+aOMZgOkJ//57zRxA=",
"path": "github.com/lib/pq",
"revision": "67c3f2a8884c9b1aac5503c8d42ae4f73a93511c",
"revisionTime": "2017-01-17T20:56:33Z"
"revision": "a6657b2386e9b8be76484c08711b02c7cf867ead",
"revisionTime": "2017-02-01T01:15:56Z"
},
{
"checksumSHA1": "xppHi82MLqVx1eyQmbhTesAEjx8=",
"path": "github.com/lib/pq/oid",
"revision": "67c3f2a8884c9b1aac5503c8d42ae4f73a93511c",
"revisionTime": "2017-01-17T20:56:33Z"
"revision": "a6657b2386e9b8be76484c08711b02c7cf867ead",
"revisionTime": "2017-02-01T01:15:56Z"
},
{
"checksumSHA1": "I4njd26dG5hxFT2nawuByM4pxzY=",
@ -859,16 +859,16 @@
"revisionTime": "2016-10-27T14:08:23Z"
},
{
"checksumSHA1": "Of2wB6l121oKU3vdvoW/oCof/Kk=",
"checksumSHA1": "aEQOJ5PDOybetOpUvOo7HqicJ1s=",
"path": "github.com/michaelklishin/rabbit-hole",
"revision": "dce1682389d64fe896a5bfa393859f6a1357f14b",
"revisionTime": "2017-01-03T20:02:21Z"
"revision": "6e6fd8776f56a98f5b3b22085e2d5745d2195aeb",
"revisionTime": "2017-02-02T07:45:48Z"
},
{
"checksumSHA1": "uS0nPPynAbOV8XdNot9Fftz2JDo=",
"checksumSHA1": "6zsRRzJoi5zxQMp6iV/2EraRxPA=",
"path": "github.com/mitchellh/cli",
"revision": "fa17b36f6c61f1ddbbb08c9f6fde94b3c065a09d",
"revisionTime": "2016-10-29T23:27:12Z"
"revision": "16bda1254c1d199d9f10a4b90060eda75221a006",
"revisionTime": "2017-02-01T16:57:07Z"
},
{
"checksumSHA1": "kSmDazz+cokgcHQT7q56Na+IBe0=",
@ -943,10 +943,10 @@
"revisionTime": "2017-01-08T23:12:12Z"
},
{
"checksumSHA1": "L+p4t3KrLDAKJnrreOz2BZIt9Mg=",
"checksumSHA1": "usUy/UxFXpMusOWgLNDNp4+s/ks=",
"path": "github.com/prometheus/procfs",
"revision": "fcdb11ccb4389efb1b210b7ffb623ab71c5fdd60",
"revisionTime": "2016-12-06T22:21:41Z"
"revision": "1878d9fbb537119d24b21ca07effd591627cd160",
"revisionTime": "2017-01-28T16:01:23Z"
},
{
"checksumSHA1": "Yqr9OQ7AuIB1N0HMbSxqEoVQG+k=",
@ -981,110 +981,110 @@
{
"checksumSHA1": "vE43s37+4CJ2CDU6TlOUOYE0K9c=",
"path": "golang.org/x/crypto/bcrypt",
"revision": "854ae91cdcbf914b499b1d7641d07859f3653481",
"revisionTime": "2017-01-26T19:47:58Z"
"revision": "bed12803fa9663d7aa2c2346b0c634ad2dcd43b7",
"revisionTime": "2017-02-01T20:15:17Z"
},
{
"checksumSHA1": "JsJdKXhz87gWenMwBeejTOeNE7k=",
"path": "golang.org/x/crypto/blowfish",
"revision": "854ae91cdcbf914b499b1d7641d07859f3653481",
"revisionTime": "2017-01-26T19:47:58Z"
"revision": "bed12803fa9663d7aa2c2346b0c634ad2dcd43b7",
"revisionTime": "2017-02-01T20:15:17Z"
},
{
"checksumSHA1": "dwOedwBJ1EIK9+S3t108Bx054Y8=",
"path": "golang.org/x/crypto/curve25519",
"revision": "854ae91cdcbf914b499b1d7641d07859f3653481",
"revisionTime": "2017-01-26T19:47:58Z"
"revision": "bed12803fa9663d7aa2c2346b0c634ad2dcd43b7",
"revisionTime": "2017-02-01T20:15:17Z"
},
{
"checksumSHA1": "wGb//LjBPNxYHqk+dcLo7BjPXK8=",
"path": "golang.org/x/crypto/ed25519",
"revision": "854ae91cdcbf914b499b1d7641d07859f3653481",
"revisionTime": "2017-01-26T19:47:58Z"
"revision": "bed12803fa9663d7aa2c2346b0c634ad2dcd43b7",
"revisionTime": "2017-02-01T20:15:17Z"
},
{
"checksumSHA1": "LXFcVx8I587SnWmKycSDEq9yvK8=",
"path": "golang.org/x/crypto/ed25519/internal/edwards25519",
"revision": "854ae91cdcbf914b499b1d7641d07859f3653481",
"revisionTime": "2017-01-26T19:47:58Z"
"revision": "bed12803fa9663d7aa2c2346b0c634ad2dcd43b7",
"revisionTime": "2017-02-01T20:15:17Z"
},
{
"checksumSHA1": "4D8hxMIaSDEW5pCQk22Xj4DcDh4=",
"path": "golang.org/x/crypto/hkdf",
"revision": "854ae91cdcbf914b499b1d7641d07859f3653481",
"revisionTime": "2017-01-26T19:47:58Z"
"revision": "bed12803fa9663d7aa2c2346b0c634ad2dcd43b7",
"revisionTime": "2017-02-01T20:15:17Z"
},
{
"checksumSHA1": "MCeXr2RNeiG1XG6V+er1OR0qyeo=",
"path": "golang.org/x/crypto/md4",
"revision": "854ae91cdcbf914b499b1d7641d07859f3653481",
"revisionTime": "2017-01-26T19:47:58Z"
"revision": "bed12803fa9663d7aa2c2346b0c634ad2dcd43b7",
"revisionTime": "2017-02-01T20:15:17Z"
},
{
"checksumSHA1": "ALID2qEiXlaj7SVGShqPTuMYRb0=",
"checksumSHA1": "epMTdzGOxeFViKskp4XR6csi/2U=",
"path": "golang.org/x/crypto/ssh",
"revision": "854ae91cdcbf914b499b1d7641d07859f3653481",
"revisionTime": "2017-01-26T19:47:58Z"
"revision": "bed12803fa9663d7aa2c2346b0c634ad2dcd43b7",
"revisionTime": "2017-02-01T20:15:17Z"
},
{
"checksumSHA1": "SJ3Ma3Ozavxpbh1usZWBCnzMKIc=",
"path": "golang.org/x/crypto/ssh/agent",
"revision": "854ae91cdcbf914b499b1d7641d07859f3653481",
"revisionTime": "2017-01-26T19:47:58Z"
"revision": "bed12803fa9663d7aa2c2346b0c634ad2dcd43b7",
"revisionTime": "2017-02-01T20:15:17Z"
},
{
"checksumSHA1": "xiderUuvye8Kpn7yX3niiJg32bE=",
"path": "golang.org/x/crypto/ssh/terminal",
"revision": "854ae91cdcbf914b499b1d7641d07859f3653481",
"revisionTime": "2017-01-26T19:47:58Z"
"revision": "bed12803fa9663d7aa2c2346b0c634ad2dcd43b7",
"revisionTime": "2017-02-01T20:15:17Z"
},
{
"checksumSHA1": "9jjO5GjLa0XF/nfWihF02RoH4qc=",
"checksumSHA1": "Y+HGqEkYM15ir+J93MEaHdyFy0c=",
"path": "golang.org/x/net/context",
"revision": "f2499483f923065a842d38eb4c7f1927e6fc6e6d",
"revisionTime": "2017-01-14T04:22:49Z"
"revision": "007e530097ad7f954752df63046b4036f98ba6a6",
"revisionTime": "2017-02-01T22:13:12Z"
},
{
"checksumSHA1": "WHc3uByvGaMcnSoI21fhzYgbOgg=",
"path": "golang.org/x/net/context/ctxhttp",
"revision": "f2499483f923065a842d38eb4c7f1927e6fc6e6d",
"revisionTime": "2017-01-14T04:22:49Z"
"revision": "007e530097ad7f954752df63046b4036f98ba6a6",
"revisionTime": "2017-02-01T22:13:12Z"
},
{
"checksumSHA1": "N1akwAdrHVfPPrsFOhG2ouP21VA=",
"checksumSHA1": "LC+mzxnIrUS9Kr4s7shpY+A9J2o=",
"path": "golang.org/x/net/http2",
"revision": "f2499483f923065a842d38eb4c7f1927e6fc6e6d",
"revisionTime": "2017-01-14T04:22:49Z"
"revision": "007e530097ad7f954752df63046b4036f98ba6a6",
"revisionTime": "2017-02-01T22:13:12Z"
},
{
"checksumSHA1": "HzuGD7AwgC0p1az1WAQnEFnEk98=",
"checksumSHA1": "G3e2/HrQjRy2Ml9lfX0e3AGRWWE=",
"path": "golang.org/x/net/http2/hpack",
"revision": "f2499483f923065a842d38eb4c7f1927e6fc6e6d",
"revisionTime": "2017-01-14T04:22:49Z"
"revision": "007e530097ad7f954752df63046b4036f98ba6a6",
"revisionTime": "2017-02-01T22:13:12Z"
},
{
"checksumSHA1": "GIGmSrYACByf5JDIP9ByBZksY80=",
"path": "golang.org/x/net/idna",
"revision": "f2499483f923065a842d38eb4c7f1927e6fc6e6d",
"revisionTime": "2017-01-14T04:22:49Z"
"revision": "007e530097ad7f954752df63046b4036f98ba6a6",
"revisionTime": "2017-02-01T22:13:12Z"
},
{
"checksumSHA1": "/k7k6eJDkxXx6K9Zpo/OwNm58XM=",
"checksumSHA1": "UxahDzW2v4mf/+aFxruuupaoIwo=",
"path": "golang.org/x/net/internal/timeseries",
"revision": "f2499483f923065a842d38eb4c7f1927e6fc6e6d",
"revisionTime": "2017-01-14T04:22:49Z"
"revision": "007e530097ad7f954752df63046b4036f98ba6a6",
"revisionTime": "2017-02-01T22:13:12Z"
},
{
"checksumSHA1": "3xyuaSNmClqG4YWC7g0isQIbUTc=",
"path": "golang.org/x/net/lex/httplex",
"revision": "f2499483f923065a842d38eb4c7f1927e6fc6e6d",
"revisionTime": "2017-01-14T04:22:49Z"
"revision": "007e530097ad7f954752df63046b4036f98ba6a6",
"revisionTime": "2017-02-01T22:13:12Z"
},
{
"checksumSHA1": "GQHKESPeCcAsnerZPtHadvKUIzs=",
"path": "golang.org/x/net/trace",
"revision": "f2499483f923065a842d38eb4c7f1927e6fc6e6d",
"revisionTime": "2017-01-14T04:22:49Z"
"revision": "007e530097ad7f954752df63046b4036f98ba6a6",
"revisionTime": "2017-02-01T22:13:12Z"
},
{
"checksumSHA1": "XH7CgbL5Z8COUc+MKrYqS3FFosY=",
@ -1119,8 +1119,8 @@
{
"checksumSHA1": "uTQtOqR0ePMMcvuvAIksiIZxhqU=",
"path": "golang.org/x/sys/unix",
"revision": "d75a52659825e75fff6158388dddc6a5b04f9ba5",
"revisionTime": "2016-12-14T18:38:57Z"
"revision": "7a6e5648d140666db5d920909e082ca00a87ba2c",
"revisionTime": "2017-02-01T04:15:14Z"
},
{
"checksumSHA1": "a1NkriuA/uk+Wv6yCFzxz4LIaDg=",
@ -1249,76 +1249,76 @@
"revisionTime": "2017-01-21T00:08:17Z"
},
{
"checksumSHA1": "epHwh7hDQSYzDowPIbw8vnLzPS0=",
"checksumSHA1": "mEyChIkG797MtkrJQXW8X/qZ0l0=",
"path": "google.golang.org/grpc",
"revision": "50955793b0183f9de69bd78e2ec251cf20aab121",
"revisionTime": "2017-01-11T19:10:52Z"
"revision": "21f8ed309495401e6fd79b3a9fd549582aed1b4c",
"revisionTime": "2017-01-27T15:26:01Z"
},
{
"checksumSHA1": "08icuA15HRkdYCt6H+Cs90RPQsY=",
"path": "google.golang.org/grpc/codes",
"revision": "50955793b0183f9de69bd78e2ec251cf20aab121",
"revisionTime": "2017-01-11T19:10:52Z"
"revision": "21f8ed309495401e6fd79b3a9fd549582aed1b4c",
"revisionTime": "2017-01-27T15:26:01Z"
},
{
"checksumSHA1": "AGkvu7gY1jWK7v5s9a8qLlH2gcQ=",
"path": "google.golang.org/grpc/credentials",
"revision": "50955793b0183f9de69bd78e2ec251cf20aab121",
"revisionTime": "2017-01-11T19:10:52Z"
"revision": "21f8ed309495401e6fd79b3a9fd549582aed1b4c",
"revisionTime": "2017-01-27T15:26:01Z"
},
{
"checksumSHA1": "bg3wIPzajKt3QZfTG70EPaxDtpk=",
"path": "google.golang.org/grpc/credentials/oauth",
"revision": "50955793b0183f9de69bd78e2ec251cf20aab121",
"revisionTime": "2017-01-11T19:10:52Z"
"revision": "21f8ed309495401e6fd79b3a9fd549582aed1b4c",
"revisionTime": "2017-01-27T15:26:01Z"
},
{
"checksumSHA1": "3Lt5hNAG8qJAYSsNghR5uA1zQns=",
"path": "google.golang.org/grpc/grpclog",
"revision": "50955793b0183f9de69bd78e2ec251cf20aab121",
"revisionTime": "2017-01-11T19:10:52Z"
"revision": "21f8ed309495401e6fd79b3a9fd549582aed1b4c",
"revisionTime": "2017-01-27T15:26:01Z"
},
{
"checksumSHA1": "T3Q0p8kzvXFnRkMaK/G8mCv6mc0=",
"path": "google.golang.org/grpc/internal",
"revision": "50955793b0183f9de69bd78e2ec251cf20aab121",
"revisionTime": "2017-01-11T19:10:52Z"
"revision": "21f8ed309495401e6fd79b3a9fd549582aed1b4c",
"revisionTime": "2017-01-27T15:26:01Z"
},
{
"checksumSHA1": "XXpD8+S3gLrfmCLOf+RbxblOQkU=",
"path": "google.golang.org/grpc/metadata",
"revision": "50955793b0183f9de69bd78e2ec251cf20aab121",
"revisionTime": "2017-01-11T19:10:52Z"
"revision": "21f8ed309495401e6fd79b3a9fd549582aed1b4c",
"revisionTime": "2017-01-27T15:26:01Z"
},
{
"checksumSHA1": "4GSUFhOQ0kdFlBH4D5OTeKy78z0=",
"path": "google.golang.org/grpc/naming",
"revision": "50955793b0183f9de69bd78e2ec251cf20aab121",
"revisionTime": "2017-01-11T19:10:52Z"
"revision": "21f8ed309495401e6fd79b3a9fd549582aed1b4c",
"revisionTime": "2017-01-27T15:26:01Z"
},
{
"checksumSHA1": "3RRoLeH6X2//7tVClOVzxW2bY+E=",
"path": "google.golang.org/grpc/peer",
"revision": "50955793b0183f9de69bd78e2ec251cf20aab121",
"revisionTime": "2017-01-11T19:10:52Z"
"revision": "21f8ed309495401e6fd79b3a9fd549582aed1b4c",
"revisionTime": "2017-01-27T15:26:01Z"
},
{
"checksumSHA1": "wzkOAxlah+y75EpH0QVgzb8hdfc=",
"path": "google.golang.org/grpc/stats",
"revision": "50955793b0183f9de69bd78e2ec251cf20aab121",
"revisionTime": "2017-01-11T19:10:52Z"
"revision": "21f8ed309495401e6fd79b3a9fd549582aed1b4c",
"revisionTime": "2017-01-27T15:26:01Z"
},
{
"checksumSHA1": "N0TftT6/CyWqp6VRi2DqDx60+Fo=",
"path": "google.golang.org/grpc/tap",
"revision": "50955793b0183f9de69bd78e2ec251cf20aab121",
"revisionTime": "2017-01-11T19:10:52Z"
"revision": "21f8ed309495401e6fd79b3a9fd549582aed1b4c",
"revisionTime": "2017-01-27T15:26:01Z"
},
{
"checksumSHA1": "yHpUeGwKoqqwd3cbEp3lkcnvft0=",
"path": "google.golang.org/grpc/transport",
"revision": "50955793b0183f9de69bd78e2ec251cf20aab121",
"revisionTime": "2017-01-11T19:10:52Z"
"revision": "21f8ed309495401e6fd79b3a9fd549582aed1b4c",
"revisionTime": "2017-01-27T15:26:01Z"
},
{
"checksumSHA1": "wSu8owMAP7GixsYoSZ4CmKUVhnU=",