v1alpha1

package
v2.16.3 Latest Latest
Warning

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

Go to latest
Published: Apr 11, 2024 License: AGPL-3.0, AGPL-3.0 Imports: 6 Imported by: 0

Documentation

Overview

Package v1alpha1 contains API Schema definitions for the update v1alpha1 API group +kubebuilder:object:generate=true +groupName=update.edgeless.systems

Index

Constants

View Source
const (
	// NodeGoalJoin is the goal to join the cluster.
	NodeGoalJoin PendingNodeGoal = "Join"
	// NodeGoalLeave is the goal to leave the cluster and terminate the node.
	NodeGoalLeave PendingNodeGoal = "Leave"

	// NodeStateUnknown is the default state of the node if no information is available.
	NodeStateUnknown CSPNodeState = "Unknown"
	// NodeStateCreating is the state of the node when it is being created.
	NodeStateCreating CSPNodeState = "Creating"
	// NodeStateReady is the state of the node when it is ready to use.
	// This state is reached when the CSP reports a node to be ready.
	// This does not guarantee that a node has already joined the cluster.
	NodeStateReady CSPNodeState = "Ready"
	// NodeStateStopped is the state of the node when not running temporarily.
	NodeStateStopped CSPNodeState = "Stopped"
	// NodeStateTerminating is the state of the node when it is being terminated.
	NodeStateTerminating CSPNodeState = "Terminating"
	// NodeStateTerminated is the state of the node when it is terminated.
	NodeStateTerminated CSPNodeState = "Terminated"
	// NodeStateFailed is the state of the node when it encounters an unrecoverable error.
	NodeStateFailed CSPNodeState = "Failed"
)

Variables

View Source
var (
	// GroupVersion is group version used to register these objects.
	GroupVersion = schema.GroupVersion{Group: "update.edgeless.systems", Version: "v1alpha1"}

	// SchemeBuilder is used to add go types to the GroupVersionKind scheme.
	SchemeBuilder = &scheme.Builder{GroupVersion: GroupVersion}

	// AddToScheme adds the types in this group-version to the given scheme.
	AddToScheme = SchemeBuilder.AddToScheme
)

Functions

This section is empty.

Types

type AutoscalingStrategy

type AutoscalingStrategy struct {
	metav1.TypeMeta   `json:",inline"`
	metav1.ObjectMeta `json:"metadata,omitempty"`

	Spec   AutoscalingStrategySpec   `json:"spec,omitempty"`
	Status AutoscalingStrategyStatus `json:"status,omitempty"`
}

AutoscalingStrategy is the Schema for the autoscalingstrategies API.

func (*AutoscalingStrategy) DeepCopy

func (in *AutoscalingStrategy) DeepCopy() *AutoscalingStrategy

DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new AutoscalingStrategy.

func (*AutoscalingStrategy) DeepCopyInto

func (in *AutoscalingStrategy) DeepCopyInto(out *AutoscalingStrategy)

DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.

func (*AutoscalingStrategy) DeepCopyObject

func (in *AutoscalingStrategy) DeepCopyObject() runtime.Object

DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object.

type AutoscalingStrategyList

type AutoscalingStrategyList struct {
	metav1.TypeMeta `json:",inline"`
	metav1.ListMeta `json:"metadata,omitempty"`
	Items           []AutoscalingStrategy `json:"items"`
}

AutoscalingStrategyList contains a list of AutoscalingStrategy.

func (*AutoscalingStrategyList) DeepCopy

DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new AutoscalingStrategyList.

func (*AutoscalingStrategyList) DeepCopyInto

func (in *AutoscalingStrategyList) DeepCopyInto(out *AutoscalingStrategyList)

DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.

func (*AutoscalingStrategyList) DeepCopyObject

func (in *AutoscalingStrategyList) DeepCopyObject() runtime.Object

DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object.

type AutoscalingStrategySpec

type AutoscalingStrategySpec struct {
	// Enabled defines whether cluster autoscaling should be enabled or not.
	Enabled bool `json:"enabled"`
	// DeploymentName defines the name of the autoscaler deployment.
	DeploymentName string `json:"deploymentName"`
	// DeploymentNamespace defines the namespace of the autoscaler deployment.
	DeploymentNamespace string `json:"deploymentNamespace"`
	// AutoscalerExtraArgs defines extra arguments to be passed to the autoscaler.
	AutoscalerExtraArgs map[string]string `json:"autoscalerExtraArgs,omitempty"`
}

AutoscalingStrategySpec defines the desired state of AutoscalingStrategy.

func (*AutoscalingStrategySpec) DeepCopy

DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new AutoscalingStrategySpec.

func (*AutoscalingStrategySpec) DeepCopyInto

func (in *AutoscalingStrategySpec) DeepCopyInto(out *AutoscalingStrategySpec)

DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.

type AutoscalingStrategyStatus

type AutoscalingStrategyStatus struct {
	// Enabled shows whether cluster autoscaling is currently enabled or not.
	// +optional
	Enabled bool `json:"enabled,omitempty"`
	// Replicas is the number of replicas for the autoscaler deployment.
	// +optional
	Replicas int32 `json:"replicas,omitempty"`
}

AutoscalingStrategyStatus defines the observed state of AutoscalingStrategy.

func (*AutoscalingStrategyStatus) DeepCopy

DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new AutoscalingStrategyStatus.

func (*AutoscalingStrategyStatus) DeepCopyInto

DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.

type CSPNodeState

type CSPNodeState string

CSPNodeState is the state of a Node in the cloud. Only one of the following states may be specified. +kubebuilder:validation:Enum=Unknown;Creating;Ready;Stopped;Terminating;Terminated;Failed

type JoiningNode

type JoiningNode struct {
	metav1.TypeMeta   `json:",inline"`
	metav1.ObjectMeta `json:"metadata,omitempty"`

	Spec   JoiningNodeSpec   `json:"spec,omitempty"`
	Status JoiningNodeStatus `json:"status,omitempty"`
}

JoiningNode is the Schema for the joiningnodes API.

func (*JoiningNode) DeepCopy

func (in *JoiningNode) DeepCopy() *JoiningNode

DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new JoiningNode.

func (*JoiningNode) DeepCopyInto

func (in *JoiningNode) DeepCopyInto(out *JoiningNode)

DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.

func (*JoiningNode) DeepCopyObject

func (in *JoiningNode) DeepCopyObject() runtime.Object

DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object.

type JoiningNodeList

type JoiningNodeList struct {
	metav1.TypeMeta `json:",inline"`
	metav1.ListMeta `json:"metadata,omitempty"`
	Items           []JoiningNode `json:"items"`
}

JoiningNodeList contains a list of JoiningNodes.

func (*JoiningNodeList) DeepCopy

func (in *JoiningNodeList) DeepCopy() *JoiningNodeList

DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new JoiningNodeList.

func (*JoiningNodeList) DeepCopyInto

func (in *JoiningNodeList) DeepCopyInto(out *JoiningNodeList)

DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.

func (*JoiningNodeList) DeepCopyObject

func (in *JoiningNodeList) DeepCopyObject() runtime.Object

DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object.

type JoiningNodeSpec

type JoiningNodeSpec struct {
	// Name of the node expected to join.
	Name string `json:"name,omitempty"`
	// ComponentsReference is the reference to the ConfigMap containing the components.
	ComponentsReference string `json:"componentsreference,omitempty"`
	// IsControlPlane is true if the node is a control plane node.
	IsControlPlane bool `json:"iscontrolplane,omitempty"`
	// Deadline is the time after which the joining node is considered to have failed.
	Deadline *metav1.Time `json:"deadline,omitempty"`
}

JoiningNodeSpec defines the components hash which the node should be annotated with.

func (*JoiningNodeSpec) DeepCopy

func (in *JoiningNodeSpec) DeepCopy() *JoiningNodeSpec

DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new JoiningNodeSpec.

func (*JoiningNodeSpec) DeepCopyInto

func (in *JoiningNodeSpec) DeepCopyInto(out *JoiningNodeSpec)

DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.

type JoiningNodeStatus

type JoiningNodeStatus struct{}

JoiningNodeStatus defines the observed state of JoiningNode.

func (*JoiningNodeStatus) DeepCopy

func (in *JoiningNodeStatus) DeepCopy() *JoiningNodeStatus

DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new JoiningNodeStatus.

func (*JoiningNodeStatus) DeepCopyInto

func (in *JoiningNodeStatus) DeepCopyInto(out *JoiningNodeStatus)

DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.

type NodeRole

type NodeRole string

NodeRole is the role of a node. +kubebuilder:validation:Enum=Worker;ControlPlane

const (
	// ConditionOutdated is used to signal outdated scaling groups.
	ConditionOutdated = "Outdated"

	// UnknownRole is used to signal unknown scaling group roles.
	UnknownRole NodeRole = ""
	// WorkerRole is used to signal worker scaling groups.
	WorkerRole NodeRole = "Worker"
	// ControlPlaneRole is used to signal control plane scaling groups.
	ControlPlaneRole NodeRole = "ControlPlane"
)

func NodeRoleFromString

func NodeRoleFromString(s string) NodeRole

NodeRoleFromString returns the NodeRole for the given string.

type NodeVersion

type NodeVersion struct {
	metav1.TypeMeta   `json:",inline"`
	metav1.ObjectMeta `json:"metadata,omitempty"`

	Spec   NodeVersionSpec   `json:"spec,omitempty"`
	Status NodeVersionStatus `json:"status,omitempty"`
}

NodeVersion is the Schema for the nodeversions API.

func (*NodeVersion) DeepCopy

func (in *NodeVersion) DeepCopy() *NodeVersion

DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new NodeVersion.

func (*NodeVersion) DeepCopyInto

func (in *NodeVersion) DeepCopyInto(out *NodeVersion)

DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.

func (*NodeVersion) DeepCopyObject

func (in *NodeVersion) DeepCopyObject() runtime.Object

DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object.

type NodeVersionList

type NodeVersionList struct {
	metav1.TypeMeta `json:",inline"`
	metav1.ListMeta `json:"metadata,omitempty"`
	Items           []NodeVersion `json:"items"`
}

NodeVersionList contains a list of NodeVersion.

func (*NodeVersionList) DeepCopy

func (in *NodeVersionList) DeepCopy() *NodeVersionList

DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new NodeVersionList.

func (*NodeVersionList) DeepCopyInto

func (in *NodeVersionList) DeepCopyInto(out *NodeVersionList)

DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.

func (*NodeVersionList) DeepCopyObject

func (in *NodeVersionList) DeepCopyObject() runtime.Object

DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object.

type NodeVersionSpec

type NodeVersionSpec struct {
	// ImageReference is the image to use for all nodes.
	ImageReference string `json:"image,omitempty"`
	// ImageVersion is the CSP independent version of the image to use for all nodes.
	ImageVersion string `json:"imageVersion,omitempty"`
	// KubernetesComponentsReference is a reference to the ConfigMap containing the Kubernetes components to use for all nodes.
	KubernetesComponentsReference string `json:"kubernetesComponentsReference,omitempty"`
	// KubernetesClusterVersion is the advertised Kubernetes version of the cluster.
	KubernetesClusterVersion string `json:"kubernetesClusterVersion,omitempty"`
}

NodeVersionSpec defines the desired state of NodeVersion.

func (*NodeVersionSpec) DeepCopy

func (in *NodeVersionSpec) DeepCopy() *NodeVersionSpec

DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new NodeVersionSpec.

func (*NodeVersionSpec) DeepCopyInto

func (in *NodeVersionSpec) DeepCopyInto(out *NodeVersionSpec)

DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.

type NodeVersionStatus

type NodeVersionStatus struct {
	// Outdated is a list of nodes that are using an outdated image.
	Outdated []corev1.ObjectReference `json:"outdated,omitempty"`
	// UpToDate is a list of nodes that are using the latest image and labels.
	UpToDate []corev1.ObjectReference `json:"upToDate,omitempty"`
	// Donors is a list of outdated nodes that donate labels to heirs.
	Donors []corev1.ObjectReference `json:"donors,omitempty"`
	// Heirs is a list of nodes using the latest image that still need to inherit labels from donors.
	Heirs []corev1.ObjectReference `json:"heirs,omitempty"`
	// Mints is a list of up to date nodes that will become heirs.
	Mints []corev1.ObjectReference `json:"mints,omitempty"`
	// AwaitingAnnotation is a list of nodes that are waiting for the operator to annotate them.
	AwaitingAnnotation []corev1.ObjectReference `json:"awaitingAnnotation,omitempty"`
	// Pending is a list of pending nodes (joining or leaving the cluster).
	Pending []corev1.ObjectReference `json:"pending,omitempty"`
	// Obsolete is a list of obsolete nodes (nodes that have been created by the operator but are no longer needed).
	Obsolete []corev1.ObjectReference `json:"obsolete,omitempty"`
	// Invalid is a list of invalid nodes (nodes that cannot be processed by the operator due to missing information or transient faults).
	Invalid []corev1.ObjectReference `json:"invalid,omitempty"`
	// Budget is the amount of extra nodes that can be created as replacements for outdated nodes.
	Budget uint32 `json:"budget"`
	// Conditions represent the latest available observations of an object's state
	Conditions []metav1.Condition `json:"conditions"`
	// ActiveClusterVersionUpgrade indicates whether the cluster is currently upgrading.
	ActiveClusterVersionUpgrade bool `json:"activeclusterversionupgrade"`
}

NodeVersionStatus defines the observed state of NodeVersion.

func (*NodeVersionStatus) DeepCopy

func (in *NodeVersionStatus) DeepCopy() *NodeVersionStatus

DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new NodeVersionStatus.

func (*NodeVersionStatus) DeepCopyInto

func (in *NodeVersionStatus) DeepCopyInto(out *NodeVersionStatus)

DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.

type PendingNode

type PendingNode struct {
	metav1.TypeMeta   `json:",inline"`
	metav1.ObjectMeta `json:"metadata,omitempty"`

	Spec   PendingNodeSpec   `json:"spec,omitempty"`
	Status PendingNodeStatus `json:"status,omitempty"`
}

PendingNode is the Schema for the pendingnodes API.

func (*PendingNode) DeepCopy

func (in *PendingNode) DeepCopy() *PendingNode

DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new PendingNode.

func (*PendingNode) DeepCopyInto

func (in *PendingNode) DeepCopyInto(out *PendingNode)

DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.

func (*PendingNode) DeepCopyObject

func (in *PendingNode) DeepCopyObject() runtime.Object

DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object.

type PendingNodeGoal

type PendingNodeGoal string

PendingNodeGoal is the desired state of PendingNode. Only one of the following goals may be specified. +kubebuilder:validation:Enum=Join;Leave

type PendingNodeList

type PendingNodeList struct {
	metav1.TypeMeta `json:",inline"`
	metav1.ListMeta `json:"metadata,omitempty"`
	Items           []PendingNode `json:"items"`
}

PendingNodeList contains a list of PendingNode.

func (*PendingNodeList) DeepCopy

func (in *PendingNodeList) DeepCopy() *PendingNodeList

DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new PendingNodeList.

func (*PendingNodeList) DeepCopyInto

func (in *PendingNodeList) DeepCopyInto(out *PendingNodeList)

DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.

func (*PendingNodeList) DeepCopyObject

func (in *PendingNodeList) DeepCopyObject() runtime.Object

DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object.

type PendingNodeSpec

type PendingNodeSpec struct {
	// ProviderID is the provider ID of the node.
	ProviderID string `json:"providerID,omitempty"`
	// ScalingGroupID is the ID of the group that this node shall be part of.
	ScalingGroupID string `json:"groupID,omitempty"`
	// NodeName is the kubernetes internal name of the node.
	NodeName string `json:"nodeName,omitempty"`
	// Goal is the goal of the pending state.
	Goal PendingNodeGoal `json:"goal,omitempty"`
	// Deadline is the deadline for reaching the goal state.
	// Joining nodes will be terminated if the deadline is exceeded.
	// Leaving nodes will remain as unschedulable to prevent data loss.
	// If not specified, the node may remain in the pending state indefinitely.
	// +optional
	Deadline *metav1.Time `json:"deadline,omitempty"`
}

PendingNodeSpec defines the desired state of PendingNode.

func (*PendingNodeSpec) DeepCopy

func (in *PendingNodeSpec) DeepCopy() *PendingNodeSpec

DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new PendingNodeSpec.

func (*PendingNodeSpec) DeepCopyInto

func (in *PendingNodeSpec) DeepCopyInto(out *PendingNodeSpec)

DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.

type PendingNodeStatus

type PendingNodeStatus struct {
	// CSPNodeState is the state of the node in the cloud.
	CSPNodeState `json:"cspState,omitempty"`
	// ReachedGoal is true if the node has reached the goal state.
	ReachedGoal bool `json:"reachedGoal,omitempty"`
}

PendingNodeStatus defines the observed state of PendingNode.

func (*PendingNodeStatus) DeepCopy

func (in *PendingNodeStatus) DeepCopy() *PendingNodeStatus

DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new PendingNodeStatus.

func (*PendingNodeStatus) DeepCopyInto

func (in *PendingNodeStatus) DeepCopyInto(out *PendingNodeStatus)

DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.

type ScalingGroup

type ScalingGroup struct {
	metav1.TypeMeta   `json:",inline"`
	metav1.ObjectMeta `json:"metadata,omitempty"`

	Spec   ScalingGroupSpec   `json:"spec,omitempty"`
	Status ScalingGroupStatus `json:"status,omitempty"`
}

ScalingGroup is the Schema for the scalinggroups API.

func (*ScalingGroup) DeepCopy

func (in *ScalingGroup) DeepCopy() *ScalingGroup

DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ScalingGroup.

func (*ScalingGroup) DeepCopyInto

func (in *ScalingGroup) DeepCopyInto(out *ScalingGroup)

DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.

func (*ScalingGroup) DeepCopyObject

func (in *ScalingGroup) DeepCopyObject() runtime.Object

DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object.

type ScalingGroupList

type ScalingGroupList struct {
	metav1.TypeMeta `json:",inline"`
	metav1.ListMeta `json:"metadata,omitempty"`
	Items           []ScalingGroup `json:"items"`
}

ScalingGroupList contains a list of ScalingGroup.

func (*ScalingGroupList) DeepCopy

func (in *ScalingGroupList) DeepCopy() *ScalingGroupList

DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ScalingGroupList.

func (*ScalingGroupList) DeepCopyInto

func (in *ScalingGroupList) DeepCopyInto(out *ScalingGroupList)

DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.

func (*ScalingGroupList) DeepCopyObject

func (in *ScalingGroupList) DeepCopyObject() runtime.Object

DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object.

type ScalingGroupSpec

type ScalingGroupSpec struct {
	// NodeVersion is the name of the NodeVersion resource.
	NodeVersion string `json:"nodeImage,omitempty"`
	// GroupID is the CSP specific, canonical identifier of a scaling group.
	GroupID string `json:"groupId,omitempty"`
	// AutoscalerGroupName is name that is expected by the autoscaler.
	AutoscalerGroupName string `json:"autoscalerGroupName,omitempty"`
	// NodeGroupName is the human friendly name of the node group as defined in the Constellation configuration.
	NodeGroupName string `json:"nodeGroupName,omitempty"`
	// Autoscaling specifies wether the scaling group should automatically scale using the cluster-autoscaler.
	Autoscaling bool `json:"autoscaling,omitempty"`
	// Min is the minimum number of nodes in the scaling group (used by cluster-autoscaler).
	Min int32 `json:"min,omitempty"`
	// Max is the maximum number of autoscaled nodes in the scaling group (used by cluster-autoscaler).
	Max int32 `json:"max,omitempty"`
	// Role is the role of the nodes in the scaling group.
	Role NodeRole `json:"role,omitempty"`
}

ScalingGroupSpec defines the desired state of ScalingGroup.

func (*ScalingGroupSpec) DeepCopy

func (in *ScalingGroupSpec) DeepCopy() *ScalingGroupSpec

DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ScalingGroupSpec.

func (*ScalingGroupSpec) DeepCopyInto

func (in *ScalingGroupSpec) DeepCopyInto(out *ScalingGroupSpec)

DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.

type ScalingGroupStatus

type ScalingGroupStatus struct {
	// ImageReference is the image currently used for newly created nodes in this scaling group.
	ImageReference string `json:"imageReference,omitempty"`
	// Conditions represent the latest available observations of an object's state.
	Conditions []metav1.Condition `json:"conditions"`
}

ScalingGroupStatus defines the observed state of ScalingGroup.

func (*ScalingGroupStatus) DeepCopy

func (in *ScalingGroupStatus) DeepCopy() *ScalingGroupStatus

DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ScalingGroupStatus.

func (*ScalingGroupStatus) DeepCopyInto

func (in *ScalingGroupStatus) DeepCopyInto(out *ScalingGroupStatus)

DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.

Jump to

Keyboard shortcuts

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