replicationjobs

package
v0.20230728.1130002 Latest Latest
Warning

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

Go to latest
Published: Jul 28, 2023 License: MPL-2.0 Imports: 12 Imported by: 0

README

github.com/hashicorp/go-azure-sdk/resource-manager/recoveryservicessiterecovery/2023-02-01/replicationjobs Documentation

The replicationjobs SDK allows for interaction with the Azure Resource Manager Service recoveryservicessiterecovery (API Version 2023-02-01).

This readme covers example usages, but further information on using this SDK can be found in the project root.

Import Path

import "github.com/hashicorp/go-azure-sdk/resource-manager/recoveryservicessiterecovery/2023-02-01/replicationjobs"

Client Initialization

client := replicationjobs.NewReplicationJobsClientWithBaseURI("https://management.azure.com")
client.Client.Authorizer = authorizer

Example Usage: ReplicationJobsClient.Cancel

ctx := context.TODO()
id := replicationjobs.NewReplicationJobID("12345678-1234-9876-4563-123456789012", "example-resource-group", "vaultValue", "replicationJobValue")

if err := client.CancelThenPoll(ctx, id); err != nil {
	// handle the error
}

Example Usage: ReplicationJobsClient.Export

ctx := context.TODO()
id := replicationjobs.NewVaultID("12345678-1234-9876-4563-123456789012", "example-resource-group", "vaultValue")

payload := replicationjobs.JobQueryParameter{
	// ...
}


if err := client.ExportThenPoll(ctx, id, payload); err != nil {
	// handle the error
}

Example Usage: ReplicationJobsClient.Get

ctx := context.TODO()
id := replicationjobs.NewReplicationJobID("12345678-1234-9876-4563-123456789012", "example-resource-group", "vaultValue", "replicationJobValue")

read, err := client.Get(ctx, id)
if err != nil {
	// handle the error
}
if model := read.Model; model != nil {
	// do something with the model/response object
}

Example Usage: ReplicationJobsClient.List

ctx := context.TODO()
id := replicationjobs.NewVaultID("12345678-1234-9876-4563-123456789012", "example-resource-group", "vaultValue")

// alternatively `client.List(ctx, id, replicationjobs.DefaultListOperationOptions())` can be used to do batched pagination
items, err := client.ListComplete(ctx, id, replicationjobs.DefaultListOperationOptions())
if err != nil {
	// handle the error
}
for _, item := range items {
	// do something
}

Example Usage: ReplicationJobsClient.Restart

ctx := context.TODO()
id := replicationjobs.NewReplicationJobID("12345678-1234-9876-4563-123456789012", "example-resource-group", "vaultValue", "replicationJobValue")

if err := client.RestartThenPoll(ctx, id); err != nil {
	// handle the error
}

Example Usage: ReplicationJobsClient.Resume

ctx := context.TODO()
id := replicationjobs.NewReplicationJobID("12345678-1234-9876-4563-123456789012", "example-resource-group", "vaultValue", "replicationJobValue")

payload := replicationjobs.ResumeJobParams{
	// ...
}


if err := client.ResumeThenPoll(ctx, id, payload); err != nil {
	// handle the error
}

Documentation

Index

Constants

This section is empty.

Variables

This section is empty.

Functions

func PossibleValuesForExportJobOutputSerializationType

func PossibleValuesForExportJobOutputSerializationType() []string

func ValidateReplicationJobID

func ValidateReplicationJobID(input interface{}, key string) (warnings []string, errors []error)

ValidateReplicationJobID checks that 'input' can be parsed as a Replication Job ID

func ValidateVaultID

func ValidateVaultID(input interface{}, key string) (warnings []string, errors []error)

ValidateVaultID checks that 'input' can be parsed as a Vault ID

Types

type ASRTask

type ASRTask struct {
	AllowedActions         *[]string          `json:"allowedActions,omitempty"`
	CustomDetails          TaskTypeDetails    `json:"customDetails"`
	EndTime                *string            `json:"endTime,omitempty"`
	Errors                 *[]JobErrorDetails `json:"errors,omitempty"`
	FriendlyName           *string            `json:"friendlyName,omitempty"`
	GroupTaskCustomDetails GroupTaskDetails   `json:"groupTaskCustomDetails"`
	Name                   *string            `json:"name,omitempty"`
	StartTime              *string            `json:"startTime,omitempty"`
	State                  *string            `json:"state,omitempty"`
	StateDescription       *string            `json:"stateDescription,omitempty"`
	TaskId                 *string            `json:"taskId,omitempty"`
	TaskType               *string            `json:"taskType,omitempty"`
}

func (*ASRTask) GetEndTimeAsTime

func (o *ASRTask) GetEndTimeAsTime() (*time.Time, error)

func (*ASRTask) GetStartTimeAsTime

func (o *ASRTask) GetStartTimeAsTime() (*time.Time, error)

func (*ASRTask) SetEndTimeAsTime

func (o *ASRTask) SetEndTimeAsTime(input time.Time)

func (*ASRTask) SetStartTimeAsTime

func (o *ASRTask) SetStartTimeAsTime(input time.Time)

func (*ASRTask) UnmarshalJSON

func (s *ASRTask) UnmarshalJSON(bytes []byte) error

type AsrJobDetails

type AsrJobDetails struct {

	// Fields inherited from JobDetails
	AffectedObjectDetails *map[string]string `json:"affectedObjectDetails,omitempty"`
}

func (AsrJobDetails) MarshalJSON

func (s AsrJobDetails) MarshalJSON() ([]byte, error)

type AutomationRunbookTaskDetails

type AutomationRunbookTaskDetails struct {
	AccountName         *string `json:"accountName,omitempty"`
	CloudServiceName    *string `json:"cloudServiceName,omitempty"`
	IsPrimarySideScript *bool   `json:"isPrimarySideScript,omitempty"`
	JobId               *string `json:"jobId,omitempty"`
	JobOutput           *string `json:"jobOutput,omitempty"`
	Name                *string `json:"name,omitempty"`
	RunbookId           *string `json:"runbookId,omitempty"`
	RunbookName         *string `json:"runbookName,omitempty"`
	SubscriptionId      *string `json:"subscriptionId,omitempty"`
}

func (AutomationRunbookTaskDetails) MarshalJSON

func (s AutomationRunbookTaskDetails) MarshalJSON() ([]byte, error)

type CancelOperationResponse

type CancelOperationResponse struct {
	Poller       polling.LongRunningPoller
	HttpResponse *http.Response
}

type ConsistencyCheckTaskDetails

type ConsistencyCheckTaskDetails struct {
	VMDetails *[]InconsistentVMDetails `json:"vmDetails,omitempty"`
}

func (ConsistencyCheckTaskDetails) MarshalJSON

func (s ConsistencyCheckTaskDetails) MarshalJSON() ([]byte, error)

type ExportJobDetails

type ExportJobDetails struct {
	BlobUri  *string `json:"blobUri,omitempty"`
	SasToken *string `json:"sasToken,omitempty"`

	// Fields inherited from JobDetails
	AffectedObjectDetails *map[string]string `json:"affectedObjectDetails,omitempty"`
}

func (ExportJobDetails) MarshalJSON

func (s ExportJobDetails) MarshalJSON() ([]byte, error)

type ExportJobOutputSerializationType

type ExportJobOutputSerializationType string
const (
	ExportJobOutputSerializationTypeExcel ExportJobOutputSerializationType = "Excel"
	ExportJobOutputSerializationTypeJson  ExportJobOutputSerializationType = "Json"
	ExportJobOutputSerializationTypeXml   ExportJobOutputSerializationType = "Xml"
)

type ExportOperationResponse

type ExportOperationResponse struct {
	Poller       polling.LongRunningPoller
	HttpResponse *http.Response
}

type FabricReplicationGroupTaskDetails

type FabricReplicationGroupTaskDetails struct {
	SkippedReason       *string `json:"skippedReason,omitempty"`
	SkippedReasonString *string `json:"skippedReasonString,omitempty"`

	// Fields inherited from JobTaskDetails
	JobTask *JobEntity `json:"jobTask,omitempty"`
}

func (FabricReplicationGroupTaskDetails) MarshalJSON

func (s FabricReplicationGroupTaskDetails) MarshalJSON() ([]byte, error)

type FailoverJobDetails

type FailoverJobDetails struct {
	ProtectedItemDetails *[]FailoverReplicationProtectedItemDetails `json:"protectedItemDetails,omitempty"`

	// Fields inherited from JobDetails
	AffectedObjectDetails *map[string]string `json:"affectedObjectDetails,omitempty"`
}

func (FailoverJobDetails) MarshalJSON

func (s FailoverJobDetails) MarshalJSON() ([]byte, error)

type FailoverReplicationProtectedItemDetails

type FailoverReplicationProtectedItemDetails struct {
	FriendlyName            *string `json:"friendlyName,omitempty"`
	Name                    *string `json:"name,omitempty"`
	NetworkConnectionStatus *string `json:"networkConnectionStatus,omitempty"`
	NetworkFriendlyName     *string `json:"networkFriendlyName,omitempty"`
	RecoveryPointId         *string `json:"recoveryPointId,omitempty"`
	RecoveryPointTime       *string `json:"recoveryPointTime,omitempty"`
	Subnet                  *string `json:"subnet,omitempty"`
	TestVMFriendlyName      *string `json:"testVmFriendlyName,omitempty"`
	TestVMName              *string `json:"testVmName,omitempty"`
}

func (*FailoverReplicationProtectedItemDetails) GetRecoveryPointTimeAsTime

func (o *FailoverReplicationProtectedItemDetails) GetRecoveryPointTimeAsTime() (*time.Time, error)

func (*FailoverReplicationProtectedItemDetails) SetRecoveryPointTimeAsTime

func (o *FailoverReplicationProtectedItemDetails) SetRecoveryPointTimeAsTime(input time.Time)

type GetOperationResponse

type GetOperationResponse struct {
	HttpResponse *http.Response
	Model        *Job
}

type GroupTaskDetails

type GroupTaskDetails interface {
}

type InconsistentVMDetails

type InconsistentVMDetails struct {
	CloudName          *string   `json:"cloudName,omitempty"`
	Details            *[]string `json:"details,omitempty"`
	ErrorIds           *[]string `json:"errorIds,omitempty"`
	VirtualMachineName *string   `json:"vmName,omitempty"`
}

type InlineWorkflowTaskDetails

type InlineWorkflowTaskDetails struct {
	WorkflowIds *[]string `json:"workflowIds,omitempty"`

	// Fields inherited from GroupTaskDetails
	ChildTasks *[]ASRTask `json:"childTasks,omitempty"`
}

func (InlineWorkflowTaskDetails) MarshalJSON

func (s InlineWorkflowTaskDetails) MarshalJSON() ([]byte, error)

type Job

type Job struct {
	Id         *string        `json:"id,omitempty"`
	Location   *string        `json:"location,omitempty"`
	Name       *string        `json:"name,omitempty"`
	Properties *JobProperties `json:"properties,omitempty"`
	Type       *string        `json:"type,omitempty"`
}

type JobDetails

type JobDetails interface {
}

type JobEntity

type JobEntity struct {
	JobFriendlyName    *string `json:"jobFriendlyName,omitempty"`
	JobId              *string `json:"jobId,omitempty"`
	JobScenarioName    *string `json:"jobScenarioName,omitempty"`
	TargetInstanceType *string `json:"targetInstanceType,omitempty"`
	TargetObjectId     *string `json:"targetObjectId,omitempty"`
	TargetObjectName   *string `json:"targetObjectName,omitempty"`
}

type JobErrorDetails

type JobErrorDetails struct {
	CreationTime         *string        `json:"creationTime,omitempty"`
	ErrorLevel           *string        `json:"errorLevel,omitempty"`
	ProviderErrorDetails *ProviderError `json:"providerErrorDetails,omitempty"`
	ServiceErrorDetails  *ServiceError  `json:"serviceErrorDetails,omitempty"`
	TaskId               *string        `json:"taskId,omitempty"`
}

func (*JobErrorDetails) GetCreationTimeAsTime

func (o *JobErrorDetails) GetCreationTimeAsTime() (*time.Time, error)

func (*JobErrorDetails) SetCreationTimeAsTime

func (o *JobErrorDetails) SetCreationTimeAsTime(input time.Time)

type JobOperationPredicate

type JobOperationPredicate struct {
	Id       *string
	Location *string
	Name     *string
	Type     *string
}

func (JobOperationPredicate) Matches

func (p JobOperationPredicate) Matches(input Job) bool

type JobProperties

type JobProperties struct {
	ActivityId         *string            `json:"activityId,omitempty"`
	AllowedActions     *[]string          `json:"allowedActions,omitempty"`
	CustomDetails      JobDetails         `json:"customDetails"`
	EndTime            *string            `json:"endTime,omitempty"`
	Errors             *[]JobErrorDetails `json:"errors,omitempty"`
	FriendlyName       *string            `json:"friendlyName,omitempty"`
	ScenarioName       *string            `json:"scenarioName,omitempty"`
	StartTime          *string            `json:"startTime,omitempty"`
	State              *string            `json:"state,omitempty"`
	StateDescription   *string            `json:"stateDescription,omitempty"`
	TargetInstanceType *string            `json:"targetInstanceType,omitempty"`
	TargetObjectId     *string            `json:"targetObjectId,omitempty"`
	TargetObjectName   *string            `json:"targetObjectName,omitempty"`
	Tasks              *[]ASRTask         `json:"tasks,omitempty"`
}

func (*JobProperties) GetEndTimeAsTime

func (o *JobProperties) GetEndTimeAsTime() (*time.Time, error)

func (*JobProperties) GetStartTimeAsTime

func (o *JobProperties) GetStartTimeAsTime() (*time.Time, error)

func (*JobProperties) SetEndTimeAsTime

func (o *JobProperties) SetEndTimeAsTime(input time.Time)

func (*JobProperties) SetStartTimeAsTime

func (o *JobProperties) SetStartTimeAsTime(input time.Time)

func (*JobProperties) UnmarshalJSON

func (s *JobProperties) UnmarshalJSON(bytes []byte) error

type JobQueryParameter

type JobQueryParameter struct {
	AffectedObjectTypes *string                           `json:"affectedObjectTypes,omitempty"`
	EndTime             *string                           `json:"endTime,omitempty"`
	FabricId            *string                           `json:"fabricId,omitempty"`
	JobName             *string                           `json:"jobName,omitempty"`
	JobOutputType       *ExportJobOutputSerializationType `json:"jobOutputType,omitempty"`
	JobStatus           *string                           `json:"jobStatus,omitempty"`
	StartTime           *string                           `json:"startTime,omitempty"`
	TimezoneOffset      *float64                          `json:"timezoneOffset,omitempty"`
}

type JobTaskDetails

type JobTaskDetails struct {
	JobTask *JobEntity `json:"jobTask,omitempty"`
}

func (JobTaskDetails) MarshalJSON

func (s JobTaskDetails) MarshalJSON() ([]byte, error)

type ListCompleteResult

type ListCompleteResult struct {
	Items []Job
}

type ListOperationOptions

type ListOperationOptions struct {
	Filter *string
}

func DefaultListOperationOptions

func DefaultListOperationOptions() ListOperationOptions

type ListOperationResponse

type ListOperationResponse struct {
	HttpResponse *http.Response
	Model        *[]Job
	// contains filtered or unexported fields
}

func (ListOperationResponse) HasMore

func (r ListOperationResponse) HasMore() bool

func (ListOperationResponse) LoadMore

func (r ListOperationResponse) LoadMore(ctx context.Context) (resp ListOperationResponse, err error)

type ManualActionTaskDetails

type ManualActionTaskDetails struct {
	Instructions *string `json:"instructions,omitempty"`
	Name         *string `json:"name,omitempty"`
	Observation  *string `json:"observation,omitempty"`
}

func (ManualActionTaskDetails) MarshalJSON

func (s ManualActionTaskDetails) MarshalJSON() ([]byte, error)

type ProviderError

type ProviderError struct {
	ErrorCode         *int64  `json:"errorCode,omitempty"`
	ErrorId           *string `json:"errorId,omitempty"`
	ErrorMessage      *string `json:"errorMessage,omitempty"`
	PossibleCauses    *string `json:"possibleCauses,omitempty"`
	RecommendedAction *string `json:"recommendedAction,omitempty"`
}

type RecoveryPlanGroupTaskDetails

type RecoveryPlanGroupTaskDetails struct {
	GroupId     *string `json:"groupId,omitempty"`
	Name        *string `json:"name,omitempty"`
	RpGroupType *string `json:"rpGroupType,omitempty"`

	// Fields inherited from GroupTaskDetails
	ChildTasks *[]ASRTask `json:"childTasks,omitempty"`
}

func (RecoveryPlanGroupTaskDetails) MarshalJSON

func (s RecoveryPlanGroupTaskDetails) MarshalJSON() ([]byte, error)

type RecoveryPlanShutdownGroupTaskDetails

type RecoveryPlanShutdownGroupTaskDetails struct {

	// Fields inherited from RecoveryPlanGroupTaskDetails
	GroupId     *string `json:"groupId,omitempty"`
	Name        *string `json:"name,omitempty"`
	RpGroupType *string `json:"rpGroupType,omitempty"`
}

func (RecoveryPlanShutdownGroupTaskDetails) MarshalJSON

func (s RecoveryPlanShutdownGroupTaskDetails) MarshalJSON() ([]byte, error)

type ReplicationJobId

type ReplicationJobId struct {
	SubscriptionId     string
	ResourceGroupName  string
	VaultName          string
	ReplicationJobName string
}

ReplicationJobId is a struct representing the Resource ID for a Replication Job

func NewReplicationJobID

func NewReplicationJobID(subscriptionId string, resourceGroupName string, vaultName string, replicationJobName string) ReplicationJobId

NewReplicationJobID returns a new ReplicationJobId struct

func ParseReplicationJobID

func ParseReplicationJobID(input string) (*ReplicationJobId, error)

ParseReplicationJobID parses 'input' into a ReplicationJobId

func ParseReplicationJobIDInsensitively

func ParseReplicationJobIDInsensitively(input string) (*ReplicationJobId, error)

ParseReplicationJobIDInsensitively parses 'input' case-insensitively into a ReplicationJobId note: this method should only be used for API response data and not user input

func (ReplicationJobId) ID

func (id ReplicationJobId) ID() string

ID returns the formatted Replication Job ID

func (ReplicationJobId) Segments

func (id ReplicationJobId) Segments() []resourceids.Segment

Segments returns a slice of Resource ID Segments which comprise this Replication Job ID

func (ReplicationJobId) String

func (id ReplicationJobId) String() string

String returns a human-readable description of this Replication Job ID

type ReplicationJobsClient

type ReplicationJobsClient struct {
	Client autorest.Client
	// contains filtered or unexported fields
}

func NewReplicationJobsClientWithBaseURI

func NewReplicationJobsClientWithBaseURI(endpoint string) ReplicationJobsClient

func (ReplicationJobsClient) Cancel

Cancel ...

func (ReplicationJobsClient) CancelThenPoll

func (c ReplicationJobsClient) CancelThenPoll(ctx context.Context, id ReplicationJobId) error

CancelThenPoll performs Cancel then polls until it's completed

func (ReplicationJobsClient) Export

Export ...

func (ReplicationJobsClient) ExportThenPoll

func (c ReplicationJobsClient) ExportThenPoll(ctx context.Context, id VaultId, input JobQueryParameter) error

ExportThenPoll performs Export then polls until it's completed

func (ReplicationJobsClient) Get

Get ...

func (ReplicationJobsClient) List

List ...

func (ReplicationJobsClient) ListComplete

ListComplete retrieves all of the results into a single object

func (ReplicationJobsClient) ListCompleteMatchingPredicate

func (c ReplicationJobsClient) ListCompleteMatchingPredicate(ctx context.Context, id VaultId, options ListOperationOptions, predicate JobOperationPredicate) (resp ListCompleteResult, err error)

ListCompleteMatchingPredicate retrieves all of the results and then applied the predicate

func (ReplicationJobsClient) Restart

Restart ...

func (ReplicationJobsClient) RestartThenPoll

func (c ReplicationJobsClient) RestartThenPoll(ctx context.Context, id ReplicationJobId) error

RestartThenPoll performs Restart then polls until it's completed

func (ReplicationJobsClient) Resume

Resume ...

func (ReplicationJobsClient) ResumeThenPoll

ResumeThenPoll performs Resume then polls until it's completed

type RestartOperationResponse

type RestartOperationResponse struct {
	Poller       polling.LongRunningPoller
	HttpResponse *http.Response
}

type ResumeJobParams

type ResumeJobParams struct {
	Properties *ResumeJobParamsProperties `json:"properties,omitempty"`
}

type ResumeJobParamsProperties

type ResumeJobParamsProperties struct {
	Comments *string `json:"comments,omitempty"`
}

type ResumeOperationResponse

type ResumeOperationResponse struct {
	Poller       polling.LongRunningPoller
	HttpResponse *http.Response
}

type ScriptActionTaskDetails

type ScriptActionTaskDetails struct {
	IsPrimarySideScript *bool   `json:"isPrimarySideScript,omitempty"`
	Name                *string `json:"name,omitempty"`
	Output              *string `json:"output,omitempty"`
	Path                *string `json:"path,omitempty"`
}

func (ScriptActionTaskDetails) MarshalJSON

func (s ScriptActionTaskDetails) MarshalJSON() ([]byte, error)

type ServiceError

type ServiceError struct {
	ActivityId        *string `json:"activityId,omitempty"`
	Code              *string `json:"code,omitempty"`
	Message           *string `json:"message,omitempty"`
	PossibleCauses    *string `json:"possibleCauses,omitempty"`
	RecommendedAction *string `json:"recommendedAction,omitempty"`
}

type SwitchProtectionJobDetails

type SwitchProtectionJobDetails struct {
	NewReplicationProtectedItemId *string `json:"newReplicationProtectedItemId,omitempty"`

	// Fields inherited from JobDetails
	AffectedObjectDetails *map[string]string `json:"affectedObjectDetails,omitempty"`
}

func (SwitchProtectionJobDetails) MarshalJSON

func (s SwitchProtectionJobDetails) MarshalJSON() ([]byte, error)

type TaskTypeDetails

type TaskTypeDetails interface {
}

type TestFailoverJobDetails

type TestFailoverJobDetails struct {
	Comments             *string                                    `json:"comments,omitempty"`
	NetworkFriendlyName  *string                                    `json:"networkFriendlyName,omitempty"`
	NetworkName          *string                                    `json:"networkName,omitempty"`
	NetworkType          *string                                    `json:"networkType,omitempty"`
	ProtectedItemDetails *[]FailoverReplicationProtectedItemDetails `json:"protectedItemDetails,omitempty"`
	TestFailoverStatus   *string                                    `json:"testFailoverStatus,omitempty"`

	// Fields inherited from JobDetails
	AffectedObjectDetails *map[string]string `json:"affectedObjectDetails,omitempty"`
}

func (TestFailoverJobDetails) MarshalJSON

func (s TestFailoverJobDetails) MarshalJSON() ([]byte, error)

type VMNicUpdatesTaskDetails

type VMNicUpdatesTaskDetails struct {
	Name  *string `json:"name,omitempty"`
	NicId *string `json:"nicId,omitempty"`
	VMId  *string `json:"vmId,omitempty"`
}

func (VMNicUpdatesTaskDetails) MarshalJSON

func (s VMNicUpdatesTaskDetails) MarshalJSON() ([]byte, error)

type VaultId

type VaultId struct {
	SubscriptionId    string
	ResourceGroupName string
	VaultName         string
}

VaultId is a struct representing the Resource ID for a Vault

func NewVaultID

func NewVaultID(subscriptionId string, resourceGroupName string, vaultName string) VaultId

NewVaultID returns a new VaultId struct

func ParseVaultID

func ParseVaultID(input string) (*VaultId, error)

ParseVaultID parses 'input' into a VaultId

func ParseVaultIDInsensitively

func ParseVaultIDInsensitively(input string) (*VaultId, error)

ParseVaultIDInsensitively parses 'input' case-insensitively into a VaultId note: this method should only be used for API response data and not user input

func (VaultId) ID

func (id VaultId) ID() string

ID returns the formatted Vault ID

func (VaultId) Segments

func (id VaultId) Segments() []resourceids.Segment

Segments returns a slice of Resource ID Segments which comprise this Vault ID

func (VaultId) String

func (id VaultId) String() string

String returns a human-readable description of this Vault ID

type VirtualMachineTaskDetails

type VirtualMachineTaskDetails struct {
	SkippedReason       *string `json:"skippedReason,omitempty"`
	SkippedReasonString *string `json:"skippedReasonString,omitempty"`

	// Fields inherited from JobTaskDetails
	JobTask *JobEntity `json:"jobTask,omitempty"`
}

func (VirtualMachineTaskDetails) MarshalJSON

func (s VirtualMachineTaskDetails) MarshalJSON() ([]byte, error)

Jump to

Keyboard shortcuts

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