v1alpha1

package
v0.0.0-...-c2ede47 Latest Latest
Warning

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

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

Documentation

Overview

Package v1alpha1 contains API Schema definitions for the installer v1alpha1 API group +kubebuilder:object:generate=true +groupName=install.relay.sh

Index

Constants

This section is empty.

Variables

View Source
var (
	// GroupVersion is group version used to register these objects
	GroupVersion  = schema.GroupVersion{Group: "install.relay.sh", Version: "v1alpha1"}
	RelayCoreKind = GroupVersion.WithKind("RelayCore")

	// 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 AdmissionWebhookServerConfig

type AdmissionWebhookServerConfig struct {
	// CertificateControllerImage is the image to use for the certificate
	// controller that managers the TLS certificates for the operator's webhook
	// server
	//
	// +kubebuilder:default="us-docker.pkg.dev/puppet-relay-contrib-oss/relay-core/relay-operator-webhook-certificate-controller:latest"
	// +optional
	CertificateControllerImage string `json:"certificateControllerImage,omitempty"`

	// +kubebuilder:default="IfNotPresent"
	// +optional
	CertificateControllerImagePullPolicy corev1.PullPolicy `json:"certificateControllerImagePullPolicy,omitempty"`

	// Domain is the domain to use as a suffix for the webhook subdomain.
	// Example: admission.controller.example.com
	Domain string `json:"domain,omitempty"`

	// NamespaceSelector is the map of labels to use in the NamespaceSelector
	// section of the MutatingWebhooks.
	NamespaceSelector *metav1.LabelSelector `json:"namespaceSelector,omitempty"`
}

func (*AdmissionWebhookServerConfig) DeepCopy

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

func (*AdmissionWebhookServerConfig) DeepCopyInto

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

type JWTSigningKeySource

type JWTSigningKeySource struct {
	// PrivateKeyRef is a reference to a secret containing the private key.
	PrivateKeyRef corev1.SecretKeySelector `json:"privateKeyRef,omitempty"`

	// PublicKeyRef is a reference to a secret containing the public key.
	PublicKeyRef corev1.SecretKeySelector `json:"publicKeyRef,omitempty"`
}

func (*JWTSigningKeySource) DeepCopy

func (in *JWTSigningKeySource) DeepCopy() *JWTSigningKeySource

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

func (*JWTSigningKeySource) DeepCopyInto

func (in *JWTSigningKeySource) DeepCopyInto(out *JWTSigningKeySource)

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

type LogServiceConfig

type LogServiceConfig struct {
	// Image is the container image to use for the log service.
	//
	// +kubebuilder:default="relaysh/relay-pls:latest"
	// +optional
	Image string `json:"image,omitempty"`

	// ImagePullPolicy instructs the cluster when it should attempt to pull the
	// container image.
	//
	// +kubebuilder:default="IfNotPresent"
	// +optional
	ImagePullPolicy corev1.PullPolicy `json:"imagePullPolicy,omitempty"`

	// Env is the slice of environment variables to use when launching the log
	// service.
	//
	// +optional
	Env []corev1.EnvVar `json:"env,omitempty"`

	// NodeSelector instructs the cluster how to choose a node to run the log
	// service pods.
	//
	// +optional
	NodeSelector map[string]string `json:"nodeSelector,omitempty"`

	// ServiceAccountName is the service account to use to run this service's pods.
	// This is the service account that is also handed to Vault for Kubernetes Auth.
	//
	// +optional
	ServiceAccountName string `json:"serviceAccountName,omitempty"`

	// Affinity is an optional set of affinity constraints to apply to operator
	// pods.
	//
	// +optional
	Affinity *corev1.Affinity `json:"affinity,omitempty"`

	// Replicas is the number of pods to run for this server.
	//
	// +kubebuilder:default=1
	// +optional
	Replicas int32 `json:"replicas,omitempty"`

	// VaultAgentRole is the role to use when configuring the vault agent.
	//
	// +kubebuilder:default="log-service"
	// +optional
	VaultAgentRole string `json:"vaultAgentRole,omitempty"`

	// CredentialsSecretKeyRef is the secret and key to use for the log service
	// cloud credentials
	CredentialsSecretKeyRef *corev1.SecretKeySelector `json:"credentialsSecretKeyRef,omitempty"`

	// Project is the BigQuery project to use for logging.
	Project string `json:"project,omitempty"`

	// Dataset is the BigQuery dataset to use for logging.
	Dataset string `json:"dataset,omitempty"`

	// Project is the BigQuery table to use for logging.
	Table string `json:"table,omitempty"`
}

LogServiceConfig is the configuration for the relay-log-service deployment

func (*LogServiceConfig) DeepCopy

func (in *LogServiceConfig) DeepCopy() *LogServiceConfig

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

func (*LogServiceConfig) DeepCopyInto

func (in *LogServiceConfig) DeepCopyInto(out *LogServiceConfig)

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

type MetadataAPIConfig

type MetadataAPIConfig struct {
	// +kubebuilder:default="us-docker.pkg.dev/puppet-relay-contrib-oss/relay-core/relay-metadata-api:latest"
	// +optional
	Image string `json:"image,omitempty"`

	// +kubebuilder:default="IfNotPresent"
	// +optional
	ImagePullPolicy corev1.PullPolicy `json:"imagePullPolicy,omitempty"`

	// +optional
	Env []corev1.EnvVar `json:"env,omitempty"`

	// +optional
	NodeSelector map[string]string `json:"nodeSelector,omitempty"`

	// ServiceAccountName is the service account to use to run this service's pods.
	// This is the service account that is also handed to Vault for Kubernetes Auth.
	//
	// +optional
	ServiceAccountName string `json:"serviceAccountName,omitempty"`

	// Affinity is an optional set of affinity constraints to apply to
	// metadata-api pods.
	//
	// +optional
	Affinity *corev1.Affinity `json:"affinity,omitempty"`

	// +kubebuilder:default=1
	// +optional
	Replicas int32 `json:"replicas,omitempty"`

	// TLSSecretName is the name of the secret that holds the TLS certificate
	// for enabling HTTPS on the metadata-api server. The secret object MUST
	// have two data fields called "tls.key" and "tls.crt".
	//
	// +optional
	TLSSecretName *string `json:"tlsSecretName,omitempty"`

	// URL is the URL of the metadata-api that will be used by workflows and
	// the operator. This defaults to:
	// http(s)://<RelayCore.Name>-metadata-api.<RelayCore.Namespace>.svc.cluster.local
	//
	// +optional
	URL *string `json:"url,omitempty"`

	// LogServiceURL is the URL of the service used to persist log messages.
	//
	// +optional
	LogServiceURL *string `json:"logServiceURL,omitempty"`

	// StepMetadataURL is the URL to use to fetch step metadata for schema
	// validation.
	//
	// +kubebuilder:default="https://relay.sh/step-metadata.json"
	// +optional
	StepMetadataURL string `json:"stepMetadataURL,omitempty"`

	// VaultAgentRole is the role to use when configuring the vault agent.
	//
	// +kubebuilder:default="metadata-api"
	// +optional
	VaultAgentRole string `json:"vaultAgentRole,omitempty"`

	// +kubebuilder:default="tenant"
	// +optional
	VaultAuthRole string `json:"vaultAuthRole,omitempty"`

	// +kubebuilder:default="auth/jwt-tenants"
	// +optional
	VaultAuthPath string `json:"vaultAuthPath,omitempty"`
}

MetadataAPIConfig is the configuration for the relay-metadata-api deployment

func (*MetadataAPIConfig) DeepCopy

func (in *MetadataAPIConfig) DeepCopy() *MetadataAPIConfig

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

func (*MetadataAPIConfig) DeepCopyInto

func (in *MetadataAPIConfig) DeepCopyInto(out *MetadataAPIConfig)

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

type OperatorConfig

type OperatorConfig struct {
	// +kubebuilder:default="us-docker.pkg.dev/puppet-relay-contrib-oss/relay-core/relay-operator:latest"
	// +optional
	Image string `json:"image,omitempty"`

	// +kubebuilder:default="IfNotPresent"
	// +optional
	ImagePullPolicy corev1.PullPolicy `json:"imagePullPolicy,omitempty"`

	// +optional
	Env []corev1.EnvVar `json:"env,omitempty"`

	// MetricsEnabled enables the metrics server for the operator deployment
	// and creates a service that can be used to scrape those metrics.
	//
	// +kubebuilder:default=false
	// +optional
	MetricsEnabled bool `json:"metricsEnabled"`

	// TenantSandboxingRuntimeClassName sets the class to use for sandboxing
	// application kernels on tenant pods. If this is set to a value, then
	// tenant sandboxing is enabled in the operator.
	// TODO: should this be an kubebuilder enum of supported runtimes?
	//
	// +optional
	TenantSandboxingRuntimeClassName *string `json:"tenantSandboxingRuntimeClassName,omitempty"`

	// +optional
	NodeSelector map[string]string `json:"nodeSelector,omitempty"`

	// ServiceAccountName is the service account to use to run this service's pods.
	// This is the service account that is also handed to Vault for Kubernetes Auth.
	//
	// +optional
	ServiceAccountName string `json:"serviceAccountName,omitempty"`

	// Affinity is an optional set of affinity constraints to apply to operator
	// pods.
	//
	// +optional
	Affinity *corev1.Affinity `json:"affinity,omitempty"`

	// +kubebuilder:default=false
	// +optional
	Standalone bool `json:"standalone"`

	// StorageAddr is the storage address URI for log storage.
	//
	// +optional
	StorageAddr *string `json:"storageAddr,omitempty"`

	// TenantNamespace is the Kubernetes namespace the operator should look for
	// tenant workloads on.
	//
	// +optional
	TenantNamespace *string `json:"tenantNamespace,omitempty"`

	// Workers is the number of workers the operator should run to process
	// workflows
	//
	// +kubebuilder:default=2
	// +optional
	Workers int32 `json:"workers,omitempty"`

	// ToolInjection is the configuration for the entrypointer and tool
	// injection runtime tooling.
	//
	// +optional
	ToolInjection *ToolInjectionConfig `json:"toolInjection,omitempty"`

	// AdmissionWebhookServer is the configuration for the
	// admissionregistration webhook server.
	//
	// +optional
	AdmissionWebhookServer *AdmissionWebhookServerConfig `json:"admissionWebhookServer,omitempty"`

	// VaultAgentRole is the role to use when configuring the vault agent.
	//
	// +kubebuilder:default="operator"
	// +optional
	VaultAgentRole string `json:"vaultAgentRole,omitempty"`
}

OperatorConfig is the configuration for the relay-operator deployment

func (*OperatorConfig) DeepCopy

func (in *OperatorConfig) DeepCopy() *OperatorConfig

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

func (*OperatorConfig) DeepCopyInto

func (in *OperatorConfig) DeepCopyInto(out *OperatorConfig)

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

type RelayCore

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

	Spec RelayCoreSpec `json:"spec"`
}

func (*RelayCore) DeepCopy

func (in *RelayCore) DeepCopy() *RelayCore

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

func (*RelayCore) DeepCopyInto

func (in *RelayCore) DeepCopyInto(out *RelayCore)

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

func (*RelayCore) DeepCopyObject

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

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

type RelayCoreList

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

RelayCoreList contains a list of RelayCore

func (*RelayCoreList) DeepCopy

func (in *RelayCoreList) DeepCopy() *RelayCoreList

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

func (*RelayCoreList) DeepCopyInto

func (in *RelayCoreList) DeepCopyInto(out *RelayCoreList)

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

func (*RelayCoreList) DeepCopyObject

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

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

type RelayCoreSpec

type RelayCoreSpec struct {
	// Environment is the environment this instance is running in.
	//
	// +kubebuilder:default="dev"
	// +optional
	Environment string `json:"environment,omitempty"`

	// Debug enabled debug logging and tools where possible.
	//
	// +kubebuilder:default=false
	// +optional
	Debug bool `json:"debug"`

	// LogService is the configuration for the log service.
	//
	// +optional
	LogService *LogServiceConfig `json:"logService,omitempty"`

	// Operator is the configuration for the workflow run operator.
	Operator OperatorConfig `json:"operator"`

	// MetadataAPI is the configuration for the step metadata-api server.
	MetadataAPI MetadataAPIConfig `json:"metadataAPI"`

	// Vault is the configuration for accessing vault.
	Vault VaultConfig `json:"vault"`

	// SentryDSNSecretName is the secret that holds the DSN address for Sentry
	// error and stacktrace collection. The secret object MUST have a data
	// field called "dsn".
	//
	// +optional
	SentryDSNSecretName *string `json:"sentryDSNSecretName,omitempty"`
}

RelayCoreSpec defines the desired state of RelayCore

func (*RelayCoreSpec) DeepCopy

func (in *RelayCoreSpec) DeepCopy() *RelayCoreSpec

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

func (*RelayCoreSpec) DeepCopyInto

func (in *RelayCoreSpec) DeepCopyInto(out *RelayCoreSpec)

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

type ToolInjectionConfig

type ToolInjectionConfig struct {
	// Image is the image to use for the relay tool injection.
	//
	// +kubebuilder:default="us-docker.pkg.dev/puppet-relay-contrib-oss/relay-core/relay-runtime-tools:latest"
	// +optional
	Image string `json:"image,omitempty"`
}

func (*ToolInjectionConfig) DeepCopy

func (in *ToolInjectionConfig) DeepCopy() *ToolInjectionConfig

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

func (*ToolInjectionConfig) DeepCopyInto

func (in *ToolInjectionConfig) DeepCopyInto(out *ToolInjectionConfig)

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

type VaultAuthConfig

type VaultAuthConfig struct {
	// Token is the token to use for vault server authentication when
	// configuring engine mounts and policies for relay-core components.
	//
	// +optional
	Token *VaultAuthData `json:"token,omitempty"`

	// UnsealKey enables a Job to unseal a vault server.
	// This Job only supports a singular unseal key, so
	// servers that require multiple keys will not be unsealed.
	//
	// +optional
	UnsealKey *VaultAuthData `json:"unsealKey,omitempty"`
}

func (*VaultAuthConfig) DeepCopy

func (in *VaultAuthConfig) DeepCopy() *VaultAuthConfig

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

func (*VaultAuthConfig) DeepCopyInto

func (in *VaultAuthConfig) DeepCopyInto(out *VaultAuthConfig)

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

type VaultAuthData

type VaultAuthData struct {
	// Value allows data to be provided directly.
	//
	// +optional
	Value string `json:"value,omitempty"`

	// ValueFrom allows data to be provided by another source
	// such as a Secret.
	//
	// +optional
	ValueFrom *VaultAuthSource `json:"valueFrom,omitempty"`
}

func (*VaultAuthData) DeepCopy

func (in *VaultAuthData) DeepCopy() *VaultAuthData

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

func (*VaultAuthData) DeepCopyInto

func (in *VaultAuthData) DeepCopyInto(out *VaultAuthData)

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

type VaultAuthSource

type VaultAuthSource struct {
	// SecretKeyRef selects data by looking up the value in a secret.
	//
	// +optional
	SecretKeyRef *corev1.SecretKeySelector `json:"secretKeyRef,omitempty"`
}

func (*VaultAuthSource) DeepCopy

func (in *VaultAuthSource) DeepCopy() *VaultAuthSource

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

func (*VaultAuthSource) DeepCopyInto

func (in *VaultAuthSource) DeepCopyInto(out *VaultAuthSource)

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

type VaultConfig

type VaultConfig struct {
	// Auth provides credentials for vault server authentication.
	//
	// +optional
	Auth *VaultAuthConfig `json:"auth"`

	// Engine provides the configuration for the internal vault engine.
	Engine VaultEngineConfig `json:"engine"`

	// JWTSigningKeys provides the JWT signing keys used for operations with
	// vault. If this field is not set, signing keys will be generated
	// automatically.
	//
	// +optional
	JWTSigningKeys *JWTSigningKeySource `json:"jwtSigningKeys,omitempty"`

	// Server provides the configuration for the vault server.
	Server VaultServerConfig `json:"server"`

	// Sidecar is the configuration for the vault sidecar containers.
	Sidecar VaultSidecarConfig `json:"sidecar"`
}

func (*VaultConfig) DeepCopy

func (in *VaultConfig) DeepCopy() *VaultConfig

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

func (*VaultConfig) DeepCopyInto

func (in *VaultConfig) DeepCopyInto(out *VaultConfig)

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

type VaultEngineConfig

type VaultEngineConfig struct {
	// +kubebuilder:default="us-docker.pkg.dev/puppet-relay-contrib-oss/relay-core/relay-operator-vault-init:latest"
	// +optional
	VaultInitializationImage string `json:"vaultInitializationImage,omitempty"`

	// +kubebuilder:default="IfNotPresent"
	// +optional
	VaultInitializationImagePullPolicy corev1.PullPolicy `json:"vaultInitializationImagePullPolicy,omitempty"`

	// +kubebuilder:default="pls"
	// +optional
	LogServicePath string `json:"logServicePath,omitempty"`

	// +kubebuilder:default="metadata-api"
	// +optional
	TransitKey string `json:"transitKey,omitempty"`

	// +kubebuilder:default="transit-tenants"
	// +optional
	TransitPath string `json:"transitPath,omitempty"`

	// +kubebuilder:default="customers"
	// +optional
	TenantPath string `json:"tenantPath,omitempty"`

	// AuthDelegatorServiceAccount is the name of the service account that
	// should be used to give vault token review access for the kubernetes auth
	// method.
	//
	// +optional
	AuthDelegatorServiceAccountName string `json:"authDelegatorServiceAccountName,omitempty"`
}

func (*VaultEngineConfig) DeepCopy

func (in *VaultEngineConfig) DeepCopy() *VaultEngineConfig

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

func (*VaultEngineConfig) DeepCopyInto

func (in *VaultEngineConfig) DeepCopyInto(out *VaultEngineConfig)

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

type VaultServerBuiltInConfig

type VaultServerBuiltInConfig struct {
	// +kubebuilder:default="vault:latest"
	// +optional
	Image string `json:"image,omitempty"`

	// +kubebuilder:default="IfNotPresent"
	// +optional
	ImagePullPolicy corev1.PullPolicy `json:"imagePullPolicy,omitempty"`

	// Resources sets the resource requirements for the vault sidecar containers.
	//
	// +kubebuilder:default={limits: {cpu: "50m", memory: "64Mi"}, requests: {cpu: "25m", memory: "32Mi"}}
	// +optional
	Resources corev1.ResourceRequirements `json:"resources,omitempty"`

	// ConfigMapRef is the reference to the config map that contains the
	// scripts and policies to configure vault with.
	//
	// +optional
	ConfigMapRef corev1.LocalObjectReference `json:"configMapRef,omitempty"`
}

func (*VaultServerBuiltInConfig) DeepCopy

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

func (*VaultServerBuiltInConfig) DeepCopyInto

func (in *VaultServerBuiltInConfig) DeepCopyInto(out *VaultServerBuiltInConfig)

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

type VaultServerConfig

type VaultServerConfig struct {
	// Address is the address to the vault server.
	//
	// +kubebuilder:default="http://vault:8200"
	// +optional
	Address string `json:"address,omitempty"`

	// BuiltIn optionally instantiates an internal vault deployment for use.
	//
	// +optional
	BuiltIn *VaultServerBuiltInConfig `json:"builtIn"`
}

func (*VaultServerConfig) DeepCopy

func (in *VaultServerConfig) DeepCopy() *VaultServerConfig

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

func (*VaultServerConfig) DeepCopyInto

func (in *VaultServerConfig) DeepCopyInto(out *VaultServerConfig)

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

type VaultSidecarConfig

type VaultSidecarConfig struct {
	// +kubebuilder:default="vault:latest"
	// +optional
	Image string `json:"image,omitempty"`

	// +kubebuilder:default="IfNotPresent"
	// +optional
	ImagePullPolicy corev1.PullPolicy `json:"imagePullPolicy,omitempty"`

	// Resources sets the resource requirements for the vault sidecar containers.
	//
	// +kubebuilder:default={limits: {cpu: "50m", memory: "64Mi"}, requests: {cpu: "25m", memory: "32Mi"}}
	// +optional
	Resources corev1.ResourceRequirements `json:"resources,omitempty"`
}

func (*VaultSidecarConfig) DeepCopy

func (in *VaultSidecarConfig) DeepCopy() *VaultSidecarConfig

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

func (*VaultSidecarConfig) DeepCopyInto

func (in *VaultSidecarConfig) DeepCopyInto(out *VaultSidecarConfig)

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