v1alpha1

package
v0.2.1 Latest Latest
Warning

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

Go to latest
Published: Nov 17, 2022 License: Apache-2.0 Imports: 5 Imported by: 0

Documentation

Overview

Package v1alpha1 contains API Schema definitions for the lib v1alpha1 API group +kubebuilder:object:generate=true +groupName=lib.projectsveltos.io

Index

Constants

View Source
const (
	// ClassifierFinalizer allows ClassifierReconciler to clean up resources associated with
	// Classifier before removing it from the apiserver.
	ClassifierFinalizer = "classifierfinalizer.projectsveltos.io"

	ClassifierKind = "Classifier"

	FeatureClassifier = "Classifier"
)
View Source
const (
	// ClassifierStatusProvisioning indicates that classifier is being
	// provisioned in the workload cluster
	ClassifierStatusProvisioning = ClassifierFeatureStatus("Provisioning")

	// ClassifierStatusProvisioned indicates that classifier has been
	// provisioned in the workload cluster
	ClassifierStatusProvisioned = ClassifierFeatureStatus("Provisioned")

	// ClassifierStatusFailed indicates that configuring classifier
	// in the workload cluster failed
	ClassifierStatusFailed = ClassifierFeatureStatus("Failed")

	// ClassifierStatusRemoving indicates that classifier is being
	// removed
	ClassifierStatusRemoving = ClassifierFeatureStatus("Removing")

	// ClassifierStatusRemoved indicates that classifier is removed
	ClassifierStatusRemoved = ClassifierFeatureStatus("Removed")
)
View Source
const (
	// OperationEqual will verify equality. Corresponds to ==
	OperationEqual = Operation("Equal")

	// OperationDifferent will verify difference. Corresponds to !=
	OperationDifferent = Operation("Different")
)
View Source
const (
	// ReportWaitingForDelivery indicates the report has yet to be sent to the
	// management cluster
	ReportWaitingForDelivery = ReportPhase("WaitingForDelivery")

	// ReportDelivering indicates the report has been sent to the management
	// cluster but not ack-ed yet
	ReportDelivering = ReportPhase("Delivering")

	// ReportProcessed indicates the report has been already delivered and acked
	// in the management cluster.
	ReportProcessed = ReportPhase("Processed")
)
View Source
const (
	// LogLevelNotSet indicates log severity is not set. Default configuration will apply.
	LogLevelNotSet = LogLevel("LogLevelNotSet")

	// LogLevelInfo indicates log severity info (V(0)) is set
	LogLevelInfo = LogLevel("LogLevelInfo")

	// LogLevelDebug indicates log severity debug (V(5)) is set
	LogLevelDebug = LogLevel("LogLevelDebug")

	// LogLevelVerbose indicates log severity debug (V(10)) is set
	LogLevelVerbose = LogLevel("LogLevelVerbose")
)
View Source
const (
	// ComponentSveltosManager is the sveltos-manager pod
	ComponentSveltosManager = Component("SveltosManager")

	// Classifier is the classifier pod
	ComponentClassifier = Component("Classifier")

	// ClassifierAgent is the classifier agent pod
	ComponentClassifierAgent = Component("ClassifierAgent")
)
View Source
const (
	// ClassifierLabelName is added to each ClassifierReport generated
	// for a Classifier instance
	ClassifierLabelName = "projectsveltos.io/classifier-name"
)

Variables

View Source
var (
	// GroupVersion is group version used to register these objects
	GroupVersion = schema.GroupVersion{Group: "lib.projectsveltos.io", 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 Classifier added in v0.2.1

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

	Spec   ClassifierSpec   `json:"spec,omitempty"`
	Status ClassifierStatus `json:"status,omitempty"`
}

Classifier is the Schema for the classifiers API

func (*Classifier) DeepCopy added in v0.2.1

func (in *Classifier) DeepCopy() *Classifier

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

func (*Classifier) DeepCopyInto added in v0.2.1

func (in *Classifier) DeepCopyInto(out *Classifier)

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

func (*Classifier) DeepCopyObject added in v0.2.1

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

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

type ClassifierFeatureStatus added in v0.2.1

type ClassifierFeatureStatus string

+kubebuilder:validation:Enum:=Provisioning;Provisioned;Failed;Removing;Removed

type ClassifierLabel added in v0.2.1

type ClassifierLabel struct {
	// Key is the label key
	Key string `json:"key"`

	// Value is the label value
	Value string `json:"value"`
}

func (*ClassifierLabel) DeepCopy added in v0.2.1

func (in *ClassifierLabel) DeepCopy() *ClassifierLabel

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

func (*ClassifierLabel) DeepCopyInto added in v0.2.1

func (in *ClassifierLabel) DeepCopyInto(out *ClassifierLabel)

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

type ClassifierList added in v0.2.1

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

ClassifierList contains a list of Classifier

func (*ClassifierList) DeepCopy added in v0.2.1

func (in *ClassifierList) DeepCopy() *ClassifierList

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

func (*ClassifierList) DeepCopyInto added in v0.2.1

func (in *ClassifierList) DeepCopyInto(out *ClassifierList)

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

func (*ClassifierList) DeepCopyObject added in v0.2.1

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

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

type ClassifierReport added in v0.2.1

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

	Spec   ClassifierReportSpec   `json:"spec,omitempty"`
	Status ClassifierReportStatus `json:"status,omitempty"`
}

ClassifierReport is the Schema for the classifierreports API

func (*ClassifierReport) DeepCopy added in v0.2.1

func (in *ClassifierReport) DeepCopy() *ClassifierReport

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

func (*ClassifierReport) DeepCopyInto added in v0.2.1

func (in *ClassifierReport) DeepCopyInto(out *ClassifierReport)

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

func (*ClassifierReport) DeepCopyObject added in v0.2.1

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

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

type ClassifierReportList added in v0.2.1

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

ClassifierReportList contains a list of ClassifierReport

func (*ClassifierReportList) DeepCopy added in v0.2.1

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

func (*ClassifierReportList) DeepCopyInto added in v0.2.1

func (in *ClassifierReportList) DeepCopyInto(out *ClassifierReportList)

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

func (*ClassifierReportList) DeepCopyObject added in v0.2.1

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

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

type ClassifierReportSpec added in v0.2.1

type ClassifierReportSpec struct {
	// ClusterNamespace is the namespace of the CAPI Cluster this
	// ClusterReport is for.
	ClusterNamespace string `json:"clusterNamespace"`

	// ClusterName is the name of the CAPI Cluster this ClusterReport
	// is for.
	ClusterName string `json:"clusterName"`

	// ClassifierName is the name of the Classifier instance this report
	// is for.
	ClassifierName string `json:"classifierName"`

	// Match indicates whether CAPI Cluster is currently a match for
	// the Classifier instance this report is for
	Match bool `json:"match"`
}

ClassifierReportSpec defines the desired state of ClassifierReport

func (*ClassifierReportSpec) DeepCopy added in v0.2.1

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

func (*ClassifierReportSpec) DeepCopyInto added in v0.2.1

func (in *ClassifierReportSpec) DeepCopyInto(out *ClassifierReportSpec)

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

type ClassifierReportStatus added in v0.2.1

type ClassifierReportStatus struct {
	// Phase represents the current phase of report.
	// +optional
	Phase *ReportPhase `json:"phase,omitempty"`
}

ClassifierReportStatus defines the observed state of ClassifierReport

func (*ClassifierReportStatus) DeepCopy added in v0.2.1

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

func (*ClassifierReportStatus) DeepCopyInto added in v0.2.1

func (in *ClassifierReportStatus) DeepCopyInto(out *ClassifierReportStatus)

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

type ClassifierSpec added in v0.2.1

type ClassifierSpec struct {
	// DeployedResourceConstraints allows to classify based on current deployed resources
	DeployedResourceConstraints []DeployedResourceConstraint `json:"deployedResourceConstraints,omitempty"`

	// KubernetesVersionConstraints allows to classify based on current kubernetes version
	KubernetesVersionConstraints []KubernetesVersionConstraint `json:"kubernetesVersionConstraints,omitempty"`

	// ClassifierLabels is set of labels, key,value pair, that will be added to each
	// cluster matching Classifier instance
	ClassifierLabels []ClassifierLabel `json:"classifierLabels"`
}

ClassifierSpec defines the desired state of Classifier

func (*ClassifierSpec) DeepCopy added in v0.2.1

func (in *ClassifierSpec) DeepCopy() *ClassifierSpec

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

func (*ClassifierSpec) DeepCopyInto added in v0.2.1

func (in *ClassifierSpec) DeepCopyInto(out *ClassifierSpec)

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

type ClassifierStatus added in v0.2.1

type ClassifierStatus struct {
	// MatchingClusterRefs reference all the cluster-api Cluster currently matching
	// Classifier
	MachingClusterStatuses []MachingClusterStatus `json:"machingClusterStatuses,omitempty"`

	// ClusterInfo reference all the cluster-api Cluster where Classifier
	// has been/is being deployed
	ClusterInfo []ClusterInfo `json:"clusterInfo,omitempty"`
}

ClassifierStatus defines the observed state of Classifier

func (*ClassifierStatus) DeepCopy added in v0.2.1

func (in *ClassifierStatus) DeepCopy() *ClassifierStatus

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

func (*ClassifierStatus) DeepCopyInto added in v0.2.1

func (in *ClassifierStatus) DeepCopyInto(out *ClassifierStatus)

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

type ClusterInfo added in v0.2.1

type ClusterInfo struct {
	// Cluster references the CAPI Cluster
	Cluster corev1.ObjectReference `json:"cluster"`

	// Hash represents the hash of the Classifier currently deployed
	// in the CAPI Cluster
	Hash []byte `json:"hash"`

	// Status represents the state of the feature in the workload cluster
	Status ClassifierFeatureStatus `json:"status"`

	// FailureMessage provides more information about the error.
	// +optional
	FailureMessage *string `json:"failureMessage,omitempty"`
}

func (*ClusterInfo) DeepCopy added in v0.2.1

func (in *ClusterInfo) DeepCopy() *ClusterInfo

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

func (*ClusterInfo) DeepCopyInto added in v0.2.1

func (in *ClusterInfo) DeepCopyInto(out *ClusterInfo)

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

type Component

type Component string

+kubebuilder:validation:Enum:=SveltosManager;Classifier;ClassifierAgent

type ComponentConfiguration

type ComponentConfiguration struct {
	// Component indicates which Sveltos component the configuration applies to.
	Component Component `json:"component"`

	// LogLevel is the log severity above which logs are sent to the stdout. [Default: Info]
	LogLevel LogLevel `json:"logLevel,omitempty"`
}

ComponentConfiguration is the debugging configuration to be applied to a Sveltos component.

func (*ComponentConfiguration) DeepCopy

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

func (*ComponentConfiguration) DeepCopyInto

func (in *ComponentConfiguration) DeepCopyInto(out *ComponentConfiguration)

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

type DebuggingConfiguration

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

	Spec DebuggingConfigurationSpec `json:"spec,omitempty"`
}

DebuggingConfiguration is the Schema for the debuggingconfigurations API

func (*DebuggingConfiguration) DeepCopy

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

func (*DebuggingConfiguration) DeepCopyInto

func (in *DebuggingConfiguration) DeepCopyInto(out *DebuggingConfiguration)

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

func (*DebuggingConfiguration) DeepCopyObject

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

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

type DebuggingConfigurationList

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

DebuggingConfigurationList contains a list of DebuggingConfiguration

func (*DebuggingConfigurationList) DeepCopy

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

func (*DebuggingConfigurationList) DeepCopyInto

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

func (*DebuggingConfigurationList) DeepCopyObject

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

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

type DebuggingConfigurationSpec

type DebuggingConfigurationSpec struct {
	// Configuration contains debugging configuration as granular as per component.
	// +listType=atomic
	// +optional
	Configuration []ComponentConfiguration `json:"configuration,omitempty"`
}

DebuggingConfigurationSpec defines the desired state of DebuggingConfiguration

func (*DebuggingConfigurationSpec) DeepCopy

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

func (*DebuggingConfigurationSpec) DeepCopyInto

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

type DeployedResourceConstraint added in v0.2.1

type DeployedResourceConstraint struct {
	// Namespace of the resource deployed in the CAPI Cluster.
	// Empty for resources scoped at cluster level.
	// +optional
	Namespace string `json:"namespace,omitempty"`

	// Group of the resource deployed in the CAPI Cluster.
	Group string `json:"group"`

	// Version of the resource deployed in the CAPI Cluster.
	Version string `json:"version"`

	// Kind of the resource deployed in the CAPI Cluster.
	// +kubebuilder:validation:MinLength=1
	Kind string `json:"kind"`

	// LabelFilters allows to filter resources based on current labels.
	LabelFilters []LabelFilter `json:"labelFilters,omitempty"`

	// FieldFilters allows to filter resources based on current field values.
	// Internally uses FieldSelector so only fields supported by FieldSelector can
	// be used.
	// Current list: https://github.com/kubernetes/kubernetes/blob/9d577d8a29893062dfbd669997396dbd01ab0e47/pkg/apis/core/v1/conversion.go#L33
	FieldFilters []FieldFilter `json:"fieldFilters,omitempty"`

	// MinCount is the minimum number of resources to match
	// +optional
	MinCount *int `json:"minCount,omitempty"`

	// MaxCount is the maximun number of resources to match
	// +optional
	MaxCount *int `json:"maxCount,omitempty"`
}

func (*DeployedResourceConstraint) DeepCopy added in v0.2.1

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

func (*DeployedResourceConstraint) DeepCopyInto added in v0.2.1

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

type FieldFilter added in v0.2.1

type FieldFilter struct {
	// Field is the field
	Field string `json:"field"`

	// Operation is the comparison operation
	Operation Operation `json:"operation"`

	// Value is the field value
	Value string `json:"value"`
}

func (*FieldFilter) DeepCopy added in v0.2.1

func (in *FieldFilter) DeepCopy() *FieldFilter

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

func (*FieldFilter) DeepCopyInto added in v0.2.1

func (in *FieldFilter) DeepCopyInto(out *FieldFilter)

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

type KubernetesComparison added in v0.2.1

type KubernetesComparison string
const (
	ComparisonEqual                KubernetesComparison = "Equal"
	ComparisonNotEqual             KubernetesComparison = "NotEqual"
	ComparisonGreaterThan          KubernetesComparison = "GreaterThan"
	ComparisonLessThan             KubernetesComparison = "LessThan"
	ComparisonGreaterThanOrEqualTo KubernetesComparison = "GreaterThanOrEqualTo"
	ComparisonLessThanOrEqualTo    KubernetesComparison = "LessThanOrEqualTo"
)

Define the Action constants.

type KubernetesVersionConstraint added in v0.2.1

type KubernetesVersionConstraint struct {
	// Version is the kubernetes version
	Version string `json:"version"`

	// Comparison indicate how to compare cluster kubernetes version with the specified version
	// +kubebuilder:validation:Enum=Equal;NotEqual;GreaterThan;LessThan;GreaterThanOrEqualTo;LessThanOrEqualTo
	Comparison string `json:"comparison"`
}

func (*KubernetesVersionConstraint) DeepCopy added in v0.2.1

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

func (*KubernetesVersionConstraint) DeepCopyInto added in v0.2.1

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

type LabelFilter added in v0.2.1

type LabelFilter struct {
	// Key is the label key
	Key string `json:"key"`

	// Operation is the comparison operation
	Operation Operation `json:"operation"`

	// Value is the label value
	Value string `json:"value"`
}

func (*LabelFilter) DeepCopy added in v0.2.1

func (in *LabelFilter) DeepCopy() *LabelFilter

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

func (*LabelFilter) DeepCopyInto added in v0.2.1

func (in *LabelFilter) DeepCopyInto(out *LabelFilter)

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

type LogLevel

type LogLevel string

+kubebuilder:validation:Enum:=LogLevelNotSet;LogLevelInfo;LogLevelDebug;LogLevelVerbose

type MachingClusterStatus added in v0.2.1

type MachingClusterStatus struct {
	// ClusterRef references the matching Cluster
	ClusterRef corev1.ObjectReference `json:"clusterRef"`

	// ManagedLabels indicates the labels being managed on
	// the cluster by this Classifier instance
	// +optional
	ManagedLabels []string `json:"managedLabels,omitempty"`

	// UnManagedLabel indicates the labels this Classifier instance
	// would like to manage but cannot because different instance is
	// already managing it
	// +optional
	UnManagedLabels []UnManagedLabel `json:"unManagedLabels,omitempty"`
}

func (*MachingClusterStatus) DeepCopy added in v0.2.1

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

func (*MachingClusterStatus) DeepCopyInto added in v0.2.1

func (in *MachingClusterStatus) DeepCopyInto(out *MachingClusterStatus)

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

type Operation added in v0.2.1

type Operation string

Operation specifies +kubebuilder:validation:Enum:=Equal;Different

type PolicyRef

type PolicyRef struct {
	// Namespace of the referenced resource.
	// +kubebuilder:validation:MinLength=1
	Namespace string `json:"namespace"`

	// Name of the rreferenced resource.
	// +kubebuilder:validation:MinLength=1
	Name string `json:"name"`

	// Kind of the resource. Supported kinds are: Secrets and ConfigMaps.
	// +kubebuilder:validation:Enum=Secret;ConfigMap
	Kind string `json:"kind"`
}

PolicyRef specifies a resource containing one or more policy to deploy in matching CAPI Clusters.

func (*PolicyRef) DeepCopy

func (in *PolicyRef) DeepCopy() *PolicyRef

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

func (*PolicyRef) DeepCopyInto

func (in *PolicyRef) DeepCopyInto(out *PolicyRef)

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

func (PolicyRef) String

func (r PolicyRef) String() string

type ReportPhase added in v0.2.1

type ReportPhase string

ReportPhase describes the state of a classifierReport. +kubebuilder:validation:Enum:=WaitingForDelivery;Delivering;Processed

type UnManagedLabel added in v0.2.1

type UnManagedLabel struct {
	// Key represents a label Classifier would like to manage
	// but cannot because currently managed by different instance
	Key string `json:"key"`

	// FailureMessage is a human consumable message explaining the
	// misconfiguration
	// +optional
	FailureMessage *string `json:"failureMessage,omitempty"`
}

func (*UnManagedLabel) DeepCopy added in v0.2.1

func (in *UnManagedLabel) DeepCopy() *UnManagedLabel

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

func (*UnManagedLabel) DeepCopyInto added in v0.2.1

func (in *UnManagedLabel) DeepCopyInto(out *UnManagedLabel)

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