iotjobsdataplane

package
v0.24.0 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Jul 22, 2020 License: Apache-2.0 Imports: 7 Imported by: 21

Documentation

Overview

Package iotjobsdataplane provides the client and types for making API requests to AWS IoT Jobs Data Plane.

AWS IoT Jobs is a service that allows you to define a set of jobs — remote operations that are sent to and executed on one or more devices connected to AWS IoT. For example, you can define a job that instructs a set of devices to download and install application or firmware updates, reboot, rotate certificates, or perform remote troubleshooting operations.

To create a job, you make a job document which is a description of the remote operations to be performed, and you specify a list of targets that should perform the operations. The targets can be individual things, thing groups or both.

AWS IoT Jobs sends a message to inform the targets that a job is available. The target starts the execution of the job by downloading the job document, performing the operations it specifies, and reporting its progress to AWS IoT. The Jobs service provides commands to track the progress of a job on a specific target and for all the targets of the job

See https://docs.aws.amazon.com/goto/WebAPI/iot-jobs-data-2017-09-29 for more information on this service.

See iotjobsdataplane package documentation for more information. https://docs.aws.amazon.com/sdk-for-go/api/service/iotjobsdataplane/

Using the Client

To use AWS IoT Jobs Data Plane with the SDK use the New function to create a new service client. With that client you can make API requests to the service. These clients are safe to use concurrently.

See the SDK's documentation for more information on how to use the SDK. https://docs.aws.amazon.com/sdk-for-go/api/

See aws.Config documentation for more information on configuring SDK clients. https://docs.aws.amazon.com/sdk-for-go/api/aws/#Config

See the AWS IoT Jobs Data Plane client for more information on creating client for this service. https://docs.aws.amazon.com/sdk-for-go/api/service/iotjobsdataplane/#New

Index

Constants

View Source
const (
	ServiceName = "AWS IoT Jobs Data Plane" // Service's name
	ServiceID   = "IoTJobsDataPlane"        // Service's identifier
	EndpointsID = "data.jobs.iot"           // Service's Endpoint identifier
)
View Source
const (

	// ErrCodeCertificateValidationException for service response error code
	// "CertificateValidationException".
	//
	// The certificate is invalid.
	ErrCodeCertificateValidationException = "CertificateValidationException"

	// ErrCodeInvalidRequestException for service response error code
	// "InvalidRequestException".
	//
	// The contents of the request were invalid. For example, this code is returned
	// when an UpdateJobExecution request contains invalid status details. The message
	// contains details about the error.
	ErrCodeInvalidRequestException = "InvalidRequestException"

	// ErrCodeInvalidStateTransitionException for service response error code
	// "InvalidStateTransitionException".
	//
	// An update attempted to change the job execution to a state that is invalid
	// because of the job execution's current state (for example, an attempt to
	// change a request in state SUCCESS to state IN_PROGRESS). In this case, the
	// body of the error message also contains the executionState field.
	ErrCodeInvalidStateTransitionException = "InvalidStateTransitionException"

	// ErrCodeResourceNotFoundException for service response error code
	// "ResourceNotFoundException".
	//
	// The specified resource does not exist.
	ErrCodeResourceNotFoundException = "ResourceNotFoundException"

	// ErrCodeServiceUnavailableException for service response error code
	// "ServiceUnavailableException".
	//
	// The service is temporarily unavailable.
	ErrCodeServiceUnavailableException = "ServiceUnavailableException"

	// ErrCodeTerminalStateException for service response error code
	// "TerminalStateException".
	//
	// The job is in a terminal state.
	ErrCodeTerminalStateException = "TerminalStateException"

	// ErrCodeThrottlingException for service response error code
	// "ThrottlingException".
	//
	// The rate exceeds the limit.
	ErrCodeThrottlingException = "ThrottlingException"
)

Variables

This section is empty.

Functions

This section is empty.

Types

type Client added in v0.9.0

type Client struct {
	*aws.Client
}

Client provides the API operation methods for making requests to AWS IoT Jobs Data Plane. See this package's package overview docs for details on the service.

The client's methods are safe to use concurrently. It is not safe to modify mutate any of the struct's properties though.

func New

func New(config aws.Config) *Client

New creates a new instance of the client from the provided Config.

Example:

// Create a client from just a config.
svc := iotjobsdataplane.New(myConfig)

func (*Client) DescribeJobExecutionRequest added in v0.9.0

func (c *Client) DescribeJobExecutionRequest(input *DescribeJobExecutionInput) DescribeJobExecutionRequest

DescribeJobExecutionRequest returns a request value for making API operation for AWS IoT Jobs Data Plane.

Gets details of a job execution.

// Example sending a request using DescribeJobExecutionRequest.
req := client.DescribeJobExecutionRequest(params)
resp, err := req.Send(context.TODO())
if err == nil {
    fmt.Println(resp)
}

Please also see https://docs.aws.amazon.com/goto/WebAPI/iot-jobs-data-2017-09-29/DescribeJobExecution

func (*Client) GetPendingJobExecutionsRequest added in v0.9.0

func (c *Client) GetPendingJobExecutionsRequest(input *GetPendingJobExecutionsInput) GetPendingJobExecutionsRequest

GetPendingJobExecutionsRequest returns a request value for making API operation for AWS IoT Jobs Data Plane.

Gets the list of all jobs for a thing that are not in a terminal status.

// Example sending a request using GetPendingJobExecutionsRequest.
req := client.GetPendingJobExecutionsRequest(params)
resp, err := req.Send(context.TODO())
if err == nil {
    fmt.Println(resp)
}

Please also see https://docs.aws.amazon.com/goto/WebAPI/iot-jobs-data-2017-09-29/GetPendingJobExecutions

func (*Client) StartNextPendingJobExecutionRequest added in v0.9.0

func (c *Client) StartNextPendingJobExecutionRequest(input *StartNextPendingJobExecutionInput) StartNextPendingJobExecutionRequest

StartNextPendingJobExecutionRequest returns a request value for making API operation for AWS IoT Jobs Data Plane.

Gets and starts the next pending (status IN_PROGRESS or QUEUED) job execution for a thing.

// Example sending a request using StartNextPendingJobExecutionRequest.
req := client.StartNextPendingJobExecutionRequest(params)
resp, err := req.Send(context.TODO())
if err == nil {
    fmt.Println(resp)
}

Please also see https://docs.aws.amazon.com/goto/WebAPI/iot-jobs-data-2017-09-29/StartNextPendingJobExecution

func (*Client) UpdateJobExecutionRequest added in v0.9.0

func (c *Client) UpdateJobExecutionRequest(input *UpdateJobExecutionInput) UpdateJobExecutionRequest

UpdateJobExecutionRequest returns a request value for making API operation for AWS IoT Jobs Data Plane.

Updates the status of a job execution.

// Example sending a request using UpdateJobExecutionRequest.
req := client.UpdateJobExecutionRequest(params)
resp, err := req.Send(context.TODO())
if err == nil {
    fmt.Println(resp)
}

Please also see https://docs.aws.amazon.com/goto/WebAPI/iot-jobs-data-2017-09-29/UpdateJobExecution

type DescribeJobExecutionInput

type DescribeJobExecutionInput struct {

	// Optional. A number that identifies a particular job execution on a particular
	// device. If not specified, the latest job execution is returned.
	ExecutionNumber *int64 `location:"querystring" locationName:"executionNumber" type:"long"`

	// Optional. When set to true, the response contains the job document. The default
	// is false.
	IncludeJobDocument *bool `location:"querystring" locationName:"includeJobDocument" type:"boolean"`

	// The unique identifier assigned to this job when it was created.
	//
	// JobId is a required field
	JobId *string `location:"uri" locationName:"jobId" type:"string" required:"true"`

	// The thing name associated with the device the job execution is running on.
	//
	// ThingName is a required field
	ThingName *string `location:"uri" locationName:"thingName" min:"1" type:"string" required:"true"`
	// contains filtered or unexported fields
}

func (DescribeJobExecutionInput) MarshalFields added in v0.3.0

MarshalFields encodes the AWS API shape using the passed in protocol encoder.

func (DescribeJobExecutionInput) String

func (s DescribeJobExecutionInput) String() string

String returns the string representation

func (*DescribeJobExecutionInput) Validate

func (s *DescribeJobExecutionInput) Validate() error

Validate inspects the fields of the type to determine if they are valid.

type DescribeJobExecutionOutput

type DescribeJobExecutionOutput struct {

	// Contains data about a job execution.
	Execution *JobExecution `locationName:"execution" type:"structure"`
	// contains filtered or unexported fields
}

func (DescribeJobExecutionOutput) MarshalFields added in v0.3.0

MarshalFields encodes the AWS API shape using the passed in protocol encoder.

func (DescribeJobExecutionOutput) String

String returns the string representation

type DescribeJobExecutionRequest

type DescribeJobExecutionRequest struct {
	*aws.Request
	Input *DescribeJobExecutionInput
	Copy  func(*DescribeJobExecutionInput) DescribeJobExecutionRequest
}

DescribeJobExecutionRequest is the request type for the DescribeJobExecution API operation.

func (DescribeJobExecutionRequest) Send

Send marshals and sends the DescribeJobExecution API request.

type DescribeJobExecutionResponse added in v0.9.0

type DescribeJobExecutionResponse struct {
	*DescribeJobExecutionOutput
	// contains filtered or unexported fields
}

DescribeJobExecutionResponse is the response type for the DescribeJobExecution API operation.

func (*DescribeJobExecutionResponse) SDKResponseMetdata added in v0.9.0

func (r *DescribeJobExecutionResponse) SDKResponseMetdata() *aws.Response

SDKResponseMetdata returns the response metadata for the DescribeJobExecution request.

type GetPendingJobExecutionsInput

type GetPendingJobExecutionsInput struct {

	// The name of the thing that is executing the job.
	//
	// ThingName is a required field
	ThingName *string `location:"uri" locationName:"thingName" min:"1" type:"string" required:"true"`
	// contains filtered or unexported fields
}

func (GetPendingJobExecutionsInput) MarshalFields added in v0.3.0

MarshalFields encodes the AWS API shape using the passed in protocol encoder.

func (GetPendingJobExecutionsInput) String

String returns the string representation

func (*GetPendingJobExecutionsInput) Validate

func (s *GetPendingJobExecutionsInput) Validate() error

Validate inspects the fields of the type to determine if they are valid.

type GetPendingJobExecutionsOutput

type GetPendingJobExecutionsOutput struct {

	// A list of JobExecutionSummary objects with status IN_PROGRESS.
	InProgressJobs []JobExecutionSummary `locationName:"inProgressJobs" type:"list"`

	// A list of JobExecutionSummary objects with status QUEUED.
	QueuedJobs []JobExecutionSummary `locationName:"queuedJobs" type:"list"`
	// contains filtered or unexported fields
}

func (GetPendingJobExecutionsOutput) MarshalFields added in v0.3.0

MarshalFields encodes the AWS API shape using the passed in protocol encoder.

func (GetPendingJobExecutionsOutput) String

String returns the string representation

type GetPendingJobExecutionsRequest

type GetPendingJobExecutionsRequest struct {
	*aws.Request
	Input *GetPendingJobExecutionsInput
	Copy  func(*GetPendingJobExecutionsInput) GetPendingJobExecutionsRequest
}

GetPendingJobExecutionsRequest is the request type for the GetPendingJobExecutions API operation.

func (GetPendingJobExecutionsRequest) Send

Send marshals and sends the GetPendingJobExecutions API request.

type GetPendingJobExecutionsResponse added in v0.9.0

type GetPendingJobExecutionsResponse struct {
	*GetPendingJobExecutionsOutput
	// contains filtered or unexported fields
}

GetPendingJobExecutionsResponse is the response type for the GetPendingJobExecutions API operation.

func (*GetPendingJobExecutionsResponse) SDKResponseMetdata added in v0.9.0

func (r *GetPendingJobExecutionsResponse) SDKResponseMetdata() *aws.Response

SDKResponseMetdata returns the response metadata for the GetPendingJobExecutions request.

type JobExecution

type JobExecution struct {

	// The estimated number of seconds that remain before the job execution status
	// will be changed to TIMED_OUT.
	ApproximateSecondsBeforeTimedOut *int64 `locationName:"approximateSecondsBeforeTimedOut" type:"long"`

	// A number that identifies a particular job execution on a particular device.
	// It can be used later in commands that return or update job execution information.
	ExecutionNumber *int64 `locationName:"executionNumber" type:"long"`

	// The content of the job document.
	JobDocument *string `locationName:"jobDocument" type:"string"`

	// The unique identifier you assigned to this job when it was created.
	JobId *string `locationName:"jobId" min:"1" type:"string"`

	// The time, in milliseconds since the epoch, when the job execution was last
	// updated.
	LastUpdatedAt *int64 `locationName:"lastUpdatedAt" type:"long"`

	// The time, in milliseconds since the epoch, when the job execution was enqueued.
	QueuedAt *int64 `locationName:"queuedAt" type:"long"`

	// The time, in milliseconds since the epoch, when the job execution was started.
	StartedAt *int64 `locationName:"startedAt" type:"long"`

	// The status of the job execution. Can be one of: "QUEUED", "IN_PROGRESS",
	// "FAILED", "SUCCESS", "CANCELED", "REJECTED", or "REMOVED".
	Status JobExecutionStatus `locationName:"status" type:"string" enum:"true"`

	// A collection of name/value pairs that describe the status of the job execution.
	StatusDetails map[string]string `locationName:"statusDetails" type:"map"`

	// The name of the thing that is executing the job.
	ThingName *string `locationName:"thingName" min:"1" type:"string"`

	// The version of the job execution. Job execution versions are incremented
	// each time they are updated by a device.
	VersionNumber *int64 `locationName:"versionNumber" type:"long"`
	// contains filtered or unexported fields
}

Contains data about a job execution.

func (JobExecution) MarshalFields added in v0.3.0

func (s JobExecution) MarshalFields(e protocol.FieldEncoder) error

MarshalFields encodes the AWS API shape using the passed in protocol encoder.

func (JobExecution) String

func (s JobExecution) String() string

String returns the string representation

type JobExecutionState

type JobExecutionState struct {

	// The status of the job execution. Can be one of: "QUEUED", "IN_PROGRESS",
	// "FAILED", "SUCCESS", "CANCELED", "REJECTED", or "REMOVED".
	Status JobExecutionStatus `locationName:"status" type:"string" enum:"true"`

	// A collection of name/value pairs that describe the status of the job execution.
	StatusDetails map[string]string `locationName:"statusDetails" type:"map"`

	// The version of the job execution. Job execution versions are incremented
	// each time they are updated by a device.
	VersionNumber *int64 `locationName:"versionNumber" type:"long"`
	// contains filtered or unexported fields
}

Contains data about the state of a job execution.

func (JobExecutionState) MarshalFields added in v0.3.0

func (s JobExecutionState) MarshalFields(e protocol.FieldEncoder) error

MarshalFields encodes the AWS API shape using the passed in protocol encoder.

func (JobExecutionState) String

func (s JobExecutionState) String() string

String returns the string representation

type JobExecutionStatus

type JobExecutionStatus string
const (
	JobExecutionStatusQueued     JobExecutionStatus = "QUEUED"
	JobExecutionStatusInProgress JobExecutionStatus = "IN_PROGRESS"
	JobExecutionStatusSucceeded  JobExecutionStatus = "SUCCEEDED"
	JobExecutionStatusFailed     JobExecutionStatus = "FAILED"
	JobExecutionStatusTimedOut   JobExecutionStatus = "TIMED_OUT"
	JobExecutionStatusRejected   JobExecutionStatus = "REJECTED"
	JobExecutionStatusRemoved    JobExecutionStatus = "REMOVED"
	JobExecutionStatusCanceled   JobExecutionStatus = "CANCELED"
)

Enum values for JobExecutionStatus

func (JobExecutionStatus) MarshalValue added in v0.3.0

func (enum JobExecutionStatus) MarshalValue() (string, error)

func (JobExecutionStatus) MarshalValueBuf added in v0.3.0

func (enum JobExecutionStatus) MarshalValueBuf(b []byte) ([]byte, error)

type JobExecutionSummary

type JobExecutionSummary struct {

	// A number that identifies a particular job execution on a particular device.
	ExecutionNumber *int64 `locationName:"executionNumber" type:"long"`

	// The unique identifier you assigned to this job when it was created.
	JobId *string `locationName:"jobId" min:"1" type:"string"`

	// The time, in milliseconds since the epoch, when the job execution was last
	// updated.
	LastUpdatedAt *int64 `locationName:"lastUpdatedAt" type:"long"`

	// The time, in milliseconds since the epoch, when the job execution was enqueued.
	QueuedAt *int64 `locationName:"queuedAt" type:"long"`

	// The time, in milliseconds since the epoch, when the job execution started.
	StartedAt *int64 `locationName:"startedAt" type:"long"`

	// The version of the job execution. Job execution versions are incremented
	// each time AWS IoT Jobs receives an update from a device.
	VersionNumber *int64 `locationName:"versionNumber" type:"long"`
	// contains filtered or unexported fields
}

Contains a subset of information about a job execution.

func (JobExecutionSummary) MarshalFields added in v0.3.0

func (s JobExecutionSummary) MarshalFields(e protocol.FieldEncoder) error

MarshalFields encodes the AWS API shape using the passed in protocol encoder.

func (JobExecutionSummary) String

func (s JobExecutionSummary) String() string

String returns the string representation

type StartNextPendingJobExecutionInput

type StartNextPendingJobExecutionInput struct {

	// A collection of name/value pairs that describe the status of the job execution.
	// If not specified, the statusDetails are unchanged.
	StatusDetails map[string]string `locationName:"statusDetails" type:"map"`

	// Specifies the amount of time this device has to finish execution of this
	// job. If the job execution status is not set to a terminal state before this
	// timer expires, or before the timer is reset (by calling UpdateJobExecution,
	// setting the status to IN_PROGRESS and specifying a new timeout value in field
	// stepTimeoutInMinutes) the job execution status will be automatically set
	// to TIMED_OUT. Note that setting this timeout has no effect on that job execution
	// timeout which may have been specified when the job was created (CreateJob
	// using field timeoutConfig).
	StepTimeoutInMinutes *int64 `locationName:"stepTimeoutInMinutes" type:"long"`

	// The name of the thing associated with the device.
	//
	// ThingName is a required field
	ThingName *string `location:"uri" locationName:"thingName" min:"1" type:"string" required:"true"`
	// contains filtered or unexported fields
}

func (StartNextPendingJobExecutionInput) MarshalFields added in v0.3.0

MarshalFields encodes the AWS API shape using the passed in protocol encoder.

func (StartNextPendingJobExecutionInput) String

String returns the string representation

func (*StartNextPendingJobExecutionInput) Validate

Validate inspects the fields of the type to determine if they are valid.

type StartNextPendingJobExecutionOutput

type StartNextPendingJobExecutionOutput struct {

	// A JobExecution object.
	Execution *JobExecution `locationName:"execution" type:"structure"`
	// contains filtered or unexported fields
}

func (StartNextPendingJobExecutionOutput) MarshalFields added in v0.3.0

MarshalFields encodes the AWS API shape using the passed in protocol encoder.

func (StartNextPendingJobExecutionOutput) String

String returns the string representation

type StartNextPendingJobExecutionRequest

type StartNextPendingJobExecutionRequest struct {
	*aws.Request
	Input *StartNextPendingJobExecutionInput
	Copy  func(*StartNextPendingJobExecutionInput) StartNextPendingJobExecutionRequest
}

StartNextPendingJobExecutionRequest is the request type for the StartNextPendingJobExecution API operation.

func (StartNextPendingJobExecutionRequest) Send

Send marshals and sends the StartNextPendingJobExecution API request.

type StartNextPendingJobExecutionResponse added in v0.9.0

type StartNextPendingJobExecutionResponse struct {
	*StartNextPendingJobExecutionOutput
	// contains filtered or unexported fields
}

StartNextPendingJobExecutionResponse is the response type for the StartNextPendingJobExecution API operation.

func (*StartNextPendingJobExecutionResponse) SDKResponseMetdata added in v0.9.0

func (r *StartNextPendingJobExecutionResponse) SDKResponseMetdata() *aws.Response

SDKResponseMetdata returns the response metadata for the StartNextPendingJobExecution request.

type UpdateJobExecutionInput

type UpdateJobExecutionInput struct {

	// Optional. A number that identifies a particular job execution on a particular
	// device.
	ExecutionNumber *int64 `locationName:"executionNumber" type:"long"`

	// Optional. The expected current version of the job execution. Each time you
	// update the job execution, its version is incremented. If the version of the
	// job execution stored in Jobs does not match, the update is rejected with
	// a VersionMismatch error, and an ErrorResponse that contains the current job
	// execution status data is returned. (This makes it unnecessary to perform
	// a separate DescribeJobExecution request in order to obtain the job execution
	// status data.)
	ExpectedVersion *int64 `locationName:"expectedVersion" type:"long"`

	// Optional. When set to true, the response contains the job document. The default
	// is false.
	IncludeJobDocument *bool `locationName:"includeJobDocument" type:"boolean"`

	// Optional. When included and set to true, the response contains the JobExecutionState
	// data. The default is false.
	IncludeJobExecutionState *bool `locationName:"includeJobExecutionState" type:"boolean"`

	// The unique identifier assigned to this job when it was created.
	//
	// JobId is a required field
	JobId *string `location:"uri" locationName:"jobId" min:"1" type:"string" required:"true"`

	// The new status for the job execution (IN_PROGRESS, FAILED, SUCCESS, or REJECTED).
	// This must be specified on every update.
	//
	// Status is a required field
	Status JobExecutionStatus `locationName:"status" type:"string" required:"true" enum:"true"`

	// Optional. A collection of name/value pairs that describe the status of the
	// job execution. If not specified, the statusDetails are unchanged.
	StatusDetails map[string]string `locationName:"statusDetails" type:"map"`

	// Specifies the amount of time this device has to finish execution of this
	// job. If the job execution status is not set to a terminal state before this
	// timer expires, or before the timer is reset (by again calling UpdateJobExecution,
	// setting the status to IN_PROGRESS and specifying a new timeout value in this
	// field) the job execution status will be automatically set to TIMED_OUT. Note
	// that setting or resetting this timeout has no effect on that job execution
	// timeout which may have been specified when the job was created (CreateJob
	// using field timeoutConfig).
	StepTimeoutInMinutes *int64 `locationName:"stepTimeoutInMinutes" type:"long"`

	// The name of the thing associated with the device.
	//
	// ThingName is a required field
	ThingName *string `location:"uri" locationName:"thingName" min:"1" type:"string" required:"true"`
	// contains filtered or unexported fields
}

func (UpdateJobExecutionInput) MarshalFields added in v0.3.0

MarshalFields encodes the AWS API shape using the passed in protocol encoder.

func (UpdateJobExecutionInput) String

func (s UpdateJobExecutionInput) String() string

String returns the string representation

func (*UpdateJobExecutionInput) Validate

func (s *UpdateJobExecutionInput) Validate() error

Validate inspects the fields of the type to determine if they are valid.

type UpdateJobExecutionOutput

type UpdateJobExecutionOutput struct {

	// A JobExecutionState object.
	ExecutionState *JobExecutionState `locationName:"executionState" type:"structure"`

	// The contents of the Job Documents.
	JobDocument *string `locationName:"jobDocument" type:"string"`
	// contains filtered or unexported fields
}

func (UpdateJobExecutionOutput) MarshalFields added in v0.3.0

MarshalFields encodes the AWS API shape using the passed in protocol encoder.

func (UpdateJobExecutionOutput) String

func (s UpdateJobExecutionOutput) String() string

String returns the string representation

type UpdateJobExecutionRequest

type UpdateJobExecutionRequest struct {
	*aws.Request
	Input *UpdateJobExecutionInput
	Copy  func(*UpdateJobExecutionInput) UpdateJobExecutionRequest
}

UpdateJobExecutionRequest is the request type for the UpdateJobExecution API operation.

func (UpdateJobExecutionRequest) Send

Send marshals and sends the UpdateJobExecution API request.

type UpdateJobExecutionResponse added in v0.9.0

type UpdateJobExecutionResponse struct {
	*UpdateJobExecutionOutput
	// contains filtered or unexported fields
}

UpdateJobExecutionResponse is the response type for the UpdateJobExecution API operation.

func (*UpdateJobExecutionResponse) SDKResponseMetdata added in v0.9.0

func (r *UpdateJobExecutionResponse) SDKResponseMetdata() *aws.Response

SDKResponseMetdata returns the response metadata for the UpdateJobExecution request.

Directories

Path Synopsis
Package iotjobsdataplaneiface provides an interface to enable mocking the AWS IoT Jobs Data Plane service client for testing your code.
Package iotjobsdataplaneiface provides an interface to enable mocking the AWS IoT Jobs Data Plane service client for testing your code.

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL