v1alpha1

package
v0.25.0 Latest Latest
Warning

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

Go to latest
Published: Feb 12, 2021 License: Apache-2.0 Imports: 6 Imported by: 0

Documentation

Overview

Package v1alpha1 contains API Schema definitions for the config v1alpha1 API group +kubebuilder:object:generate=true +groupName=config.kiosk.sh

Index

Constants

View Source
const TemplateInstanceNoOwnerAnnotation = "templateinstance.config.kiosk.sh/no-owner"

TemplateInstanceNoOwnerAnnotation if this annotation is set on a template instance, the template instance is not setting itself as the owner of the created objects

Variables

View Source
var (
	// GroupVersion is group version used to register these objects
	GroupVersion = schema.GroupVersion{Group: "config.kiosk.sh", 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

	// SchemeGroupVersion is a shim that expect this to be present in the api package
	SchemeGroupVersion = GroupVersion
)

Functions

This section is empty.

Types

type Account

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

	// +optional
	Spec AccountSpec `json:"spec,omitempty"`

	// +optional
	Status AccountStatus `json:"status,omitempty"`
}

Account +k8s:openapi-gen=true

func (*Account) DeepCopy

func (in *Account) DeepCopy() *Account

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

func (*Account) DeepCopyInto

func (in *Account) DeepCopyInto(out *Account)

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

func (*Account) DeepCopyObject

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

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

type AccountList

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

AccountList contains a list of Account

func (*AccountList) DeepCopy

func (in *AccountList) DeepCopy() *AccountList

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

func (*AccountList) DeepCopyInto

func (in *AccountList) DeepCopyInto(out *AccountList)

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

func (*AccountList) DeepCopyObject

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

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

type AccountNamespaceStatus

type AccountNamespaceStatus struct {
	// +optional
	Name string `json:"name,omitempty"`
}

AccountNamespaceStatus is the status for the account access objects that belong to the account

func (*AccountNamespaceStatus) DeepCopy

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

func (*AccountNamespaceStatus) DeepCopyInto

func (in *AccountNamespaceStatus) DeepCopyInto(out *AccountNamespaceStatus)

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

type AccountQuota

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

	Spec AccountQuotaSpec `json:"spec,omitempty"`

	// +optional
	Status AccountQuotaStatus `json:"status,omitempty"`
}

AccountQuota is the Schema for the accountquotas API +k8s:openapi-gen=true

func (*AccountQuota) DeepCopy

func (in *AccountQuota) DeepCopy() *AccountQuota

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

func (*AccountQuota) DeepCopyInto

func (in *AccountQuota) DeepCopyInto(out *AccountQuota)

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

func (*AccountQuota) DeepCopyObject

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

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

type AccountQuotaList

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

AccountQuotaList contains a list of AccountQuota

func (*AccountQuotaList) DeepCopy

func (in *AccountQuotaList) DeepCopy() *AccountQuotaList

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

func (*AccountQuotaList) DeepCopyInto

func (in *AccountQuotaList) DeepCopyInto(out *AccountQuotaList)

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

func (*AccountQuotaList) DeepCopyObject

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

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

type AccountQuotaSpec

type AccountQuotaSpec struct {
	// account is the name of the account this quota should apply to
	Account string `json:"account"`

	// quota is the quota definition with all the limits and selectors
	// +optional
	Quota corev1.ResourceQuotaSpec `json:"quota,omitempty"`
}

AccountQuotaSpec defines the desired state of AccountQuota

func (*AccountQuotaSpec) DeepCopy

func (in *AccountQuotaSpec) DeepCopy() *AccountQuotaSpec

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

func (*AccountQuotaSpec) DeepCopyInto

func (in *AccountQuotaSpec) DeepCopyInto(out *AccountQuotaSpec)

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

type AccountQuotaStatus

type AccountQuotaStatus struct {
	// Total defines the actual enforced quota and its current usage across all projects
	// +optional
	Total corev1.ResourceQuotaStatus `json:"total"`

	// Namespaces slices the usage by project.  This division allows for quick resolution of
	// deletion reconciliation inside of a single project without requiring a recalculation
	// across all projects.  This can be used to pull the deltas for a given project.
	// +optional
	// +nullable
	Namespaces AccountQuotasStatusByNamespace `json:"namespaces"`
}

AccountQuotaStatus defines the observed state of AccountQuota

func (*AccountQuotaStatus) DeepCopy

func (in *AccountQuotaStatus) DeepCopy() *AccountQuotaStatus

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

func (*AccountQuotaStatus) DeepCopyInto

func (in *AccountQuotaStatus) DeepCopyInto(out *AccountQuotaStatus)

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

type AccountQuotaStatusByNamespace

type AccountQuotaStatusByNamespace struct {
	// Namespace of the account this account quota applies to
	Namespace string `json:"namespace"`

	// Status indicates how many resources have been consumed by this project
	// +optional
	Status corev1.ResourceQuotaStatus `json:"status"`
}

AccountQuotaStatusByNamespace holds the status of a specific namespace

func (*AccountQuotaStatusByNamespace) DeepCopy

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

func (*AccountQuotaStatusByNamespace) DeepCopyInto

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

type AccountQuotasStatusByNamespace

type AccountQuotasStatusByNamespace []AccountQuotaStatusByNamespace

AccountQuotasStatusByNamespace bundles multiple resource quota status

func (AccountQuotasStatusByNamespace) DeepCopy

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

func (AccountQuotasStatusByNamespace) DeepCopyInto

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

type AccountSpace

type AccountSpace struct {
	// This defines the cluster role that will be used for the rolebinding when
	// creating a new space for the selected subjects
	// +optional
	ClusterRole *string `json:"clusterRole,omitempty"`

	// Limit defines how many spaces are allowed to be owned by this account. If no value is specified,
	// unlimited spaces can be created by the account (if the users have the rights to create spaces)
	// +optional
	Limit *int `json:"limit,omitempty"`

	// TemplateInstances are templates that should be created by default in a newly created space by
	// this account. Kiosk makes sure that these templates are deployed successfully, before the users of
	// this account will get access to the space
	// +optional
	TemplateInstances []AccountTemplateInstanceTemplate `json:"templateInstances,omitempty"`

	// SpaceTemplate defines a space template with default annotations and labels the space should have after
	// creation
	// +optional
	SpaceTemplate AccountSpaceTemplate `json:"spaceTemplate,omitempty"`
}

AccountSpace defines properties how many spaces can be owned by the account and how they should be created

func (*AccountSpace) DeepCopy

func (in *AccountSpace) DeepCopy() *AccountSpace

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

func (*AccountSpace) DeepCopyInto

func (in *AccountSpace) DeepCopyInto(out *AccountSpace)

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

type AccountSpaceTemplate

type AccountSpaceTemplate struct {
	// The default metadata of the space to create
	// +optional
	metav1.ObjectMeta `json:"metadata,omitempty"`
}

AccountSpaceTemplate defines a space template

func (*AccountSpaceTemplate) DeepCopy

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

func (*AccountSpaceTemplate) DeepCopyInto

func (in *AccountSpaceTemplate) DeepCopyInto(out *AccountSpaceTemplate)

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

type AccountSpec

type AccountSpec struct {
	// Space defines default options for created spaces by the account
	// +optional
	Space AccountSpace `json:"space,omitempty"`

	// Subjects are the account users
	// +optional
	Subjects []rbacv1.Subject `json:"subjects,omitempty"`
}

AccountSpec defines a single account configuration

func (*AccountSpec) DeepCopy

func (in *AccountSpec) DeepCopy() *AccountSpec

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

func (*AccountSpec) DeepCopyInto

func (in *AccountSpec) DeepCopyInto(out *AccountSpec)

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

type AccountStatus

type AccountStatus struct {
	// +optional
	Namespaces []AccountNamespaceStatus `json:"namespaces,omitempty"`
}

AccountStatus describes the current status of the account is the cluster

func (*AccountStatus) DeepCopy

func (in *AccountStatus) DeepCopy() *AccountStatus

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

func (*AccountStatus) DeepCopyInto

func (in *AccountStatus) DeepCopyInto(out *AccountStatus)

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

type AccountTemplateInstanceTemplate

type AccountTemplateInstanceTemplate struct {
	// The metadata of the template instace to create
	// +optional
	metav1.ObjectMeta `json:"metadata,omitempty"`

	// The spec of the template instance
	// +optional
	Spec TemplateInstanceSpec `json:"spec,omitempty"`
}

AccountTemplateInstanceTemplate defines a template instance template

func (*AccountTemplateInstanceTemplate) DeepCopy

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

func (*AccountTemplateInstanceTemplate) DeepCopyInto

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

type EmbeddedResource

type EmbeddedResource struct {
	runtime.RawExtension `json:",inline"`
}

EmbeddedResource holds a kubernetes resource +kubebuilder:validation:XPreserveUnknownFields +kubebuilder:validation:XEmbeddedResource

func (*EmbeddedResource) DeepCopy

func (in *EmbeddedResource) DeepCopy() *EmbeddedResource

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

func (*EmbeddedResource) DeepCopyInto

func (in *EmbeddedResource) DeepCopyInto(out *EmbeddedResource)

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

type HelmChart

type HelmChart struct {
	// Load helm chart from a repository
	// +optional
	Repository *HelmChartRepository `json:"repository,omitempty"`
}

HelmChart holds the information needed to find a chart to deploy

func (*HelmChart) DeepCopy

func (in *HelmChart) DeepCopy() *HelmChart

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

func (*HelmChart) DeepCopyInto

func (in *HelmChart) DeepCopyInto(out *HelmChart)

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

type HelmChartRepository

type HelmChartRepository struct {
	// Name of the chart to deploy
	Name string `json:"name"`

	// Version is the version of the chart to deploy
	// +optional
	Version string `json:"version,omitempty"`

	// The repo url to use
	// +optional
	RepoURL string `json:"repoUrl,omitempty"`

	// The username to use for the selected repository
	// +optional
	Username *HelmSecretRef `json:"username,omitempty"`

	// The password to use for the selected repository
	// +optional
	Password *HelmSecretRef `json:"password,omitempty"`
}

HelmChartRepository defines a helm repository where kiosk can load a chart from

func (*HelmChartRepository) DeepCopy

func (in *HelmChartRepository) DeepCopy() *HelmChartRepository

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

func (*HelmChartRepository) DeepCopyInto

func (in *HelmChartRepository) DeepCopyInto(out *HelmChartRepository)

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

type HelmConfiguration

type HelmConfiguration struct {
	// The helm release name. If omitted the template name will be used
	// +optional
	ReleaseName string `json:"releaseName,omitempty"`

	// Values in the form of name=value that will be passed to the helm command during
	// helm template
	// +optional
	SetValues []HelmSetValue `json:"setValues,omitempty"`

	// The additional helm values to use. Expected block string
	// +optional
	Values string `json:"values,omitempty"`

	// Tells us where to find the helm chart to deploy
	Chart HelmChart `json:"chart,omitempty"`
}

HelmConfiguration holds the helm configuration

func (*HelmConfiguration) DeepCopy

func (in *HelmConfiguration) DeepCopy() *HelmConfiguration

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

func (*HelmConfiguration) DeepCopyInto

func (in *HelmConfiguration) DeepCopyInto(out *HelmConfiguration)

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

type HelmSecretRef

type HelmSecretRef struct {
	Key       string `json:"key"`
	Name      string `json:"name"`
	Namespace string `json:"namespace"`
}

HelmSecretRef holds a secret reference to a secret

func (*HelmSecretRef) DeepCopy

func (in *HelmSecretRef) DeepCopy() *HelmSecretRef

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

func (*HelmSecretRef) DeepCopyInto

func (in *HelmSecretRef) DeepCopyInto(out *HelmSecretRef)

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

type HelmSetValue

type HelmSetValue struct {
	// The path of the value to set
	Name string `json:"name"`

	// The value to set
	Value string `json:"value"`

	// ForceString specifies if the parameter `--set` or `--set-string` should be used
	// +optional
	ForceString bool `json:"forceString,omitempty"`
}

HelmSetValue defines a name=value pair that will be passed to helm template

func (*HelmSetValue) DeepCopy

func (in *HelmSetValue) DeepCopy() *HelmSetValue

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

func (*HelmSetValue) DeepCopyInto

func (in *HelmSetValue) DeepCopyInto(out *HelmSetValue)

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

type Template

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

	// +optional
	Resources TemplateResources `json:"resources,omitempty"`
}

Template is the Schema for the templates API +k8s:openapi-gen=true

func (*Template) DeepCopy

func (in *Template) DeepCopy() *Template

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

func (*Template) DeepCopyInto

func (in *Template) DeepCopyInto(out *Template)

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

func (*Template) DeepCopyObject

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

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

type TemplateInstance

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

	Spec TemplateInstanceSpec `json:"spec,omitempty"`

	// +optional
	Status TemplateInstanceStatus `json:"status,omitempty"`
}

TemplateInstance is the Schema for the templatesinstance API +k8s:openapi-gen=true

func (*TemplateInstance) DeepCopy

func (in *TemplateInstance) DeepCopy() *TemplateInstance

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

func (*TemplateInstance) DeepCopyInto

func (in *TemplateInstance) DeepCopyInto(out *TemplateInstance)

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

func (*TemplateInstance) DeepCopyObject

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

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

type TemplateInstanceDeploymentStatus

type TemplateInstanceDeploymentStatus string

TemplateInstanceDeploymentStatus describes the status of template instance deployment

const (
	// TemplateInstanceDeploymentStatusDeployed describes a succeeded template instance deployment
	TemplateInstanceDeploymentStatusDeployed TemplateInstanceDeploymentStatus = "Deployed"

	// TemplateInstanceDeploymentStatusFailed describes a failed template instance deployment
	TemplateInstanceDeploymentStatusFailed TemplateInstanceDeploymentStatus = "Failed"

	// TemplateInstanceDeploymentStatusPending describes a not yet deployed template instance
	TemplateInstanceDeploymentStatusPending TemplateInstanceDeploymentStatus = ""
)

These are the valid statuses

type TemplateInstanceList

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

TemplateInstanceList contains a list of Account

func (*TemplateInstanceList) DeepCopy

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

func (*TemplateInstanceList) DeepCopyInto

func (in *TemplateInstanceList) DeepCopyInto(out *TemplateInstanceList)

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

func (*TemplateInstanceList) DeepCopyObject

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

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

type TemplateInstanceSpec

type TemplateInstanceSpec struct {
	// The template to instantiate. This is an immutable field
	Template string `json:"template"`
	// If true the template instance will keep the deployed resources in sync with the template.
	// +optional
	Sync bool `json:"sync,omitempty"`
}

TemplateInstanceSpec holds the expected cluster status of the template instance

func (*TemplateInstanceSpec) DeepCopy

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

func (*TemplateInstanceSpec) DeepCopyInto

func (in *TemplateInstanceSpec) DeepCopyInto(out *TemplateInstanceSpec)

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

type TemplateInstanceStatus

type TemplateInstanceStatus struct {
	// Status holds the template instances status
	Status TemplateInstanceDeploymentStatus `json:"status"`
	// A human readable message indicating details about why the namespace is in this condition.
	// +optional
	Message string `json:"message,omitempty"`
	// A brief CamelCase message indicating details about why the namespace is in this state.
	// +optional
	Reason string `json:"reason,omitempty"`

	// TemplateResourceVersion is the resource version of the template that was applied
	// +optional
	TemplateResourceVersion string `json:"templateResourceVersion,omitempty"`
	// TemplateManifests are the manifests that were rendered before
	// +optional
	TemplateManifests string `json:"templateManifests,omitempty"`

	// LastAppliedAt indicates when the template was last applied
	// +optional
	LastAppliedAt *metav1.Time `json:"observedAt,omitempty"`
}

TemplateInstanceStatus describes the current status of the template instance in the cluster

func (*TemplateInstanceStatus) DeepCopy

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

func (*TemplateInstanceStatus) DeepCopyInto

func (in *TemplateInstanceStatus) DeepCopyInto(out *TemplateInstanceStatus)

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

type TemplateList

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

TemplateList contains a list of Account

func (*TemplateList) DeepCopy

func (in *TemplateList) DeepCopy() *TemplateList

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

func (*TemplateList) DeepCopyInto

func (in *TemplateList) DeepCopyInto(out *TemplateList)

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

func (*TemplateList) DeepCopyObject

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

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

type TemplateResources

type TemplateResources struct {
	// manifest represents kubernetes resources that will be deployed into the target namespace
	// +optional
	Manifests []EmbeddedResource `json:"manifests,omitempty"`

	// helm defines the configuration for a helm deployment
	// +optional
	Helm *HelmConfiguration `json:"helm,omitempty"`
}

TemplateResources defines a templates resources

func (*TemplateResources) DeepCopy

func (in *TemplateResources) DeepCopy() *TemplateResources

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

func (*TemplateResources) DeepCopyInto

func (in *TemplateResources) DeepCopyInto(out *TemplateResources)

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