v1alpha1

package
v0.0.0-...-54c5aff Latest Latest
Warning

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

Go to latest
Published: Jan 17, 2023 License: Apache-2.0 Imports: 18 Imported by: 0

Documentation

Overview

Package v1alpha1 contains API Schema definitions for v1alpha1 API group +k8s:openapi-gen=true +k8s:deepcopy-gen=package,register +k8s:conversion-gen=github.com/ibm/varnish-operator/api/v1alpha1 +k8s:defaulter-gen=TypeMeta +kubebuilder:object:generate=true +groupName=caching.ibm.com

Index

Constants

View Source
const (
	LabelVarnishOwner     = "varnish-owner"
	LabelVarnishComponent = "varnish-component"
	LabelVarnishUID       = "varnish-uid"

	VarnishComponentVarnish                  = "varnish"
	VarnishComponentCacheService             = "cache-service"
	VarnishComponentNoCacheService           = "nocache-service"
	VarnishComponentClusterRole              = "clusterrole"
	VarnishComponentClusterRoleBinding       = "clusterrolebinding"
	VarnishComponentRole                     = "role"
	VarnishComponentRoleBinding              = "rolebinding"
	VarnishComponentVCLFileConfigMap         = "vcl-file-configmap"
	VarnishComponentPodDisruptionBudget      = "poddisruptionbudget"
	VarnishComponentHeadlessService          = "headless-service"
	VarnishComponentServiceAccount           = "serviceaccount"
	VarnishComponentValidatingWebhook        = "validating-webhook"
	VarnishComponentMutatingWebhook          = "mutating-webhook"
	VarnishComponentSecret                   = "secret"
	VarnishComponentPrometheusServiceMonitor = "prometheus-servicemonitor"
	VarnishComponentGrafanaDashboard         = "grafana-dashboard"

	VarnishPort                   = 6081
	VarnishAdminPort              = 6082
	VarnishPrometheusExporterPort = 9131
	VarnishControllerMetricsPort  = 8235
	HealthCheckPort               = 8234

	VarnishContainerName             = "varnish"
	VarnishMetricsExporterName       = "metrics-exporter"
	VarnishMetricsExporterImage      = "-metrics-exporter"
	VarnishControllerName            = "varnish-controller"
	VarnishControllerImage           = "-controller"
	VarnishControllerMetricsPortName = "ctrl-metrics"
	VarnishMetricsPortName           = "metrics"
	VarnishPortName                  = "varnish"
	VarnishSharedVolume              = "workdir"
	VarnishSettingsVolume            = "settings"
	VarnishSecretVolume              = "secret"

	VarnishUpdateStrategyDelayedRollingUpdate = "DelayedRollingUpdate"

	VarnishClusterBackendZoneBalancingTypeDisabled   = "disabled"
	VarnishClusterBackendZoneBalancingTypeAuto       = "auto"
	VarnishClusterBackendZoneBalancingTypeThresholds = "thresholds"
)
View Source
const (
	OnDeleteVarnishClusterStrategyType             = VarnishClusterUpdateStrategyType(appsv1.OnDeleteStatefulSetStrategyType)
	RollingUpdateVarnishClusterStrategyType        = VarnishClusterUpdateStrategyType(appsv1.RollingUpdateStatefulSetStrategyType)
	DelayedRollingUpdateVarnishClusterStrategyType = VarnishClusterUpdateStrategyType("DelayedRollingUpdate")
)

Variables

View Source
var (
	// SchemeGroupVersion is group version used to register these objects
	SchemeGroupVersion = schema.GroupVersion{Group: "caching.ibm.com", Version: "v1alpha1"}

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

	AddToSchemes runtime.SchemeBuilder
)

Functions

func AddToScheme

func AddToScheme(s *runtime.Scheme) error

AddToScheme adds all Resources to the Scheme

func RegisterDefaults

func RegisterDefaults(scheme *runtime.Scheme) error

func SetVarnishClusterDefaults

func SetVarnishClusterDefaults(in *VarnishCluster)

func SetVarnishClusterListDefaults

func SetVarnishClusterListDefaults(in *VarnishClusterList)

func SetWebhookLogger

func SetWebhookLogger(l *logger.Logger)

Types

type ObjectMetadata

type ObjectMetadata struct {
	Name        string            `json:"name,omitempty"`
	Labels      map[string]string `json:"labels,omitempty"`
	Annotations map[string]string `json:"annotations,omitempty"`
}

func (*ObjectMetadata) DeepCopy

func (in *ObjectMetadata) DeepCopy() *ObjectMetadata

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

func (*ObjectMetadata) DeepCopyInto

func (in *ObjectMetadata) DeepCopyInto(out *ObjectMetadata)

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

type PVC

type PVC struct {
	Metadata ObjectMetadata `json:"metadata,omitempty"`
	// +kubebuilder:validation:Required
	Spec v1.PersistentVolumeClaimSpec `json:"spec"`
}

func (*PVC) DeepCopy

func (in *PVC) DeepCopy() *PVC

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

func (*PVC) DeepCopyInto

func (in *PVC) DeepCopyInto(out *PVC)

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

type UpdateStrategyDelayedRollingUpdate

type UpdateStrategyDelayedRollingUpdate struct {
	DelaySeconds int32 `json:"delaySeconds,omitempty"`
}

func (*UpdateStrategyDelayedRollingUpdate) DeepCopy

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

func (*UpdateStrategyDelayedRollingUpdate) DeepCopyInto

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

type VCLStatus

type VCLStatus struct {
	Version          *string `json:"version,omitempty"`
	ConfigMapVersion string  `json:"configMapVersion"`
	Availability     string  `json:"availability"`
}

VCLStatus describes the VCL versions status

func (*VCLStatus) DeepCopy

func (in *VCLStatus) DeepCopy() *VCLStatus

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

func (*VCLStatus) DeepCopyInto

func (in *VCLStatus) DeepCopyInto(out *VCLStatus)

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

type VarnishCluster

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

	// +kubebuilder:validation:Required
	Spec   VarnishClusterSpec   `json:"spec"`
	Status VarnishClusterStatus `json:"status,omitempty"`
}

VarnishCluster is the Schema for the varnishclusters API +k8s:openapi-gen=true +kubebuilder:resource:scope=Namespaced,shortName=vc +kubebuilder:subresource:status +kubebuilder:subresource:scale:specpath=.spec.replicas,statuspath=.status.replicas,selectorpath=.status.varnishPodsSelector

func (*VarnishCluster) DeepCopy

func (in *VarnishCluster) DeepCopy() *VarnishCluster

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

func (*VarnishCluster) DeepCopyInto

func (in *VarnishCluster) DeepCopyInto(out *VarnishCluster)

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

func (*VarnishCluster) DeepCopyObject

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

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

func (*VarnishCluster) Default

func (vc *VarnishCluster) Default()

Default implements webhook.Defaulter so a webhook will be registered for the type

func (*VarnishCluster) SetupWebhookWithManager

func (vc *VarnishCluster) SetupWebhookWithManager(mgr ctrl.Manager) error

func (*VarnishCluster) ValidateCreate

func (vc *VarnishCluster) ValidateCreate() error

ValidateCreate implements webhook.Validator so a webhook will be registered for the type

func (*VarnishCluster) ValidateDelete

func (vc *VarnishCluster) ValidateDelete() error

ValidateDelete implements webhook.Validator so a webhook will be registered for the type

func (*VarnishCluster) ValidateUpdate

func (vc *VarnishCluster) ValidateUpdate(old runtime.Object) error

ValidateUpdate implements webhook.Validator so a webhook will be registered for the type

type VarnishClusterBackend

type VarnishClusterBackend struct {
	// +kubebuilder:validation:Required
	Selector map[string]string `json:"selector,omitempty"`
	// +kubebuilder:validation:Required
	Port          *intstr.IntOrString                 `json:"port,omitempty"`
	Namespaces    []string                            `json:"namespaces,omitempty"`
	OnlyReady     bool                                `json:"onlyReady,omitempty"`
	ZoneBalancing *VarnishClusterBackendZoneBalancing `json:"zoneBalancing,omitempty"`
}

func (*VarnishClusterBackend) DeepCopy

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

func (*VarnishClusterBackend) DeepCopyInto

func (in *VarnishClusterBackend) DeepCopyInto(out *VarnishClusterBackend)

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

type VarnishClusterBackendZoneBalancing

type VarnishClusterBackendZoneBalancing struct {
	// +kubebuilder:validation:Enum=auto;thresholds;disabled
	Type       string                                        `json:"type,omitempty"`
	Thresholds []VarnishClusterBackendZoneBalancingThreshold `json:"thresholds,omitempty"`
}

Defines the type and parameters for backend traffic distribution in multi-zone clusters

func (*VarnishClusterBackendZoneBalancing) DeepCopy

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

func (*VarnishClusterBackendZoneBalancing) DeepCopyInto

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

type VarnishClusterBackendZoneBalancingThreshold

type VarnishClusterBackendZoneBalancingThreshold struct {
	// +kubebuilder:validation:Required
	Local *int `json:"local"`
	// +kubebuilder:validation:Required
	Remote *int `json:"remote"`
	// +kubebuilder:validation:Required
	Threshold *int `json:"threshold"`
}

Defines one or more conditions and respective weights for backends located in the same or remote zone

func (*VarnishClusterBackendZoneBalancingThreshold) DeepCopy

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

func (*VarnishClusterBackendZoneBalancingThreshold) DeepCopyInto

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

type VarnishClusterList

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

VarnishClusterList contains a list of VarnishCluster

func (*VarnishClusterList) DeepCopy

func (in *VarnishClusterList) DeepCopy() *VarnishClusterList

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

func (*VarnishClusterList) DeepCopyInto

func (in *VarnishClusterList) DeepCopyInto(out *VarnishClusterList)

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

func (*VarnishClusterList) DeepCopyObject

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

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

type VarnishClusterMonitoring

type VarnishClusterMonitoring struct {
	PrometheusServiceMonitor *VarnishClusterMonitoringPrometheusServiceMonitor `json:"prometheusServiceMonitor,omitempty"`
	GrafanaDashboard         *VarnishClusterMonitoringGrafanaDashboard         `json:"grafanaDashboard,omitempty"`
}

func (*VarnishClusterMonitoring) DeepCopy

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

func (*VarnishClusterMonitoring) DeepCopyInto

func (in *VarnishClusterMonitoring) DeepCopyInto(out *VarnishClusterMonitoring)

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

type VarnishClusterMonitoringGrafanaDashboard

type VarnishClusterMonitoringGrafanaDashboard struct {
	Enabled   bool              `json:"enabled"`
	Title     string            `json:"title,omitempty"`
	Namespace string            `json:"namespace"`
	Labels    map[string]string `json:"labels,omitempty"`
	// +kubebuilder:validation:Required
	DatasourceName *string `json:"datasourceName,omitempty"`
}

func (*VarnishClusterMonitoringGrafanaDashboard) DeepCopy

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

func (*VarnishClusterMonitoringGrafanaDashboard) DeepCopyInto

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

type VarnishClusterMonitoringPrometheusServiceMonitor

type VarnishClusterMonitoringPrometheusServiceMonitor struct {
	Enabled        bool              `json:"enabled"`
	Namespace      string            `json:"namespace"`
	Labels         map[string]string `json:"labels,omitempty"`
	ScrapeInterval string            `json:"scrapeInterval,omitempty"`
}

func (*VarnishClusterMonitoringPrometheusServiceMonitor) DeepCopy

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

func (*VarnishClusterMonitoringPrometheusServiceMonitor) DeepCopyInto

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

type VarnishClusterService

type VarnishClusterService struct {
	// +kubebuilder:validation:Required
	Port *int32 `json:"port,omitempty"`
	// +kubebuilder:validation:Minimum=0
	// +kubebuilder:validation:Maximum=65535
	NodePort    int32  `json:"nodePort,omitempty"`
	MetricsPort *int32 `json:"metricsPort,omitempty"`
	// +kubebuilder:validation:Minimum=0
	// +kubebuilder:validation:Maximum=65535
	MetricsNodePort int32 `json:"metricsNodePort,omitempty"`
	// +kubebuilder:validation:Minimum=0
	// +kubebuilder:validation:Maximum=65535
	ControllerMetricsNodePort int32 `json:"controllerMetricsNodePort,omitempty"`
	// +kubebuilder:validation:Enum=ClusterIP;LoadBalancer;NodePort
	Type        v1.ServiceType    `json:"type,omitempty"`
	Annotations map[string]string `json:"annotations,omitempty"`
}

func (*VarnishClusterService) DeepCopy

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

func (*VarnishClusterService) DeepCopyInto

func (in *VarnishClusterService) DeepCopyInto(out *VarnishClusterService)

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

type VarnishClusterSpec

type VarnishClusterSpec struct {
	Replicas       *int32                        `json:"replicas,omitempty"`
	UpdateStrategy *VarnishClusterUpdateStrategy `json:"updateStrategy,omitempty"`
	Varnish        *VarnishClusterVarnish        `json:"varnish,omitempty"`
	// +kubebuilder:validation:Required
	VCL *VarnishClusterVCL `json:"vcl,omitempty"`
	// +kubebuilder:validation:Required
	Backend *VarnishClusterBackend `json:"backend,omitempty"`
	// +kubebuilder:validation:Required
	Service             *VarnishClusterService            `json:"service,omitempty"`
	PodDisruptionBudget *policyv1.PodDisruptionBudgetSpec `json:"podDisruptionBudget,omitempty"`
	NodeSelector        map[string]string                 `json:"nodeSelector,omitempty"`
	Affinity            *v1.Affinity                      `json:"affinity,omitempty"`
	Tolerations         []v1.Toleration                   `json:"tolerations,omitempty"`
	Monitoring          *VarnishClusterMonitoring         `json:"monitoring,omitempty"`
	// +kubebuilder:validation:Enum=debug;info;warn;error;dpanic;panic;fatal
	LogLevel string `json:"logLevel,omitempty"`
	// +kubebuilder:validation:Enum=json;console
	LogFormat         string `json:"logFormat,omitempty"`
	PriorityClassName string `json:"priorityClassName,omitempty"`
}

VarnishClusterSpec defines the desired state of VarnishCluster

func (*VarnishClusterSpec) DeepCopy

func (in *VarnishClusterSpec) DeepCopy() *VarnishClusterSpec

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

func (*VarnishClusterSpec) DeepCopyInto

func (in *VarnishClusterSpec) DeepCopyInto(out *VarnishClusterSpec)

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

type VarnishClusterStatus

type VarnishClusterStatus struct {
	VCL                 VCLStatus `json:"vcl"`
	VarnishArgs         string    `json:"varnishArgs,omitempty"`
	Replicas            int32     `json:"replicas,omitempty"`
	VarnishPodsSelector string    `json:"varnishPodsSelector,omitempty"`
}

VarnishClusterStatus defines the observed state of VarnishCluster

func (*VarnishClusterStatus) DeepCopy

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

func (*VarnishClusterStatus) DeepCopyInto

func (in *VarnishClusterStatus) DeepCopyInto(out *VarnishClusterStatus)

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

type VarnishClusterUpdateStrategy

type VarnishClusterUpdateStrategy struct {
	// +kubebuilder:validation:Enum=OnDelete;RollingUpdate;DelayedRollingUpdate
	Type                 VarnishClusterUpdateStrategyType         `json:"type,omitempty"`
	RollingUpdate        *appsv1.RollingUpdateStatefulSetStrategy `json:"rollingUpdate,omitempty"`
	DelayedRollingUpdate *UpdateStrategyDelayedRollingUpdate      `json:"delayedRollingUpdate,omitempty"`
}

func (*VarnishClusterUpdateStrategy) DeepCopy

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

func (*VarnishClusterUpdateStrategy) DeepCopyInto

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

type VarnishClusterUpdateStrategyType

type VarnishClusterUpdateStrategyType string

type VarnishClusterVCL

type VarnishClusterVCL struct {
	// +kubebuilder:validation:Required
	// +kubebuilder:validation:MaxLength=253
	// +kubebuilder:validation:Pattern=`^[a-z0-9.-]+$`
	ConfigMapName *string `json:"configMapName,omitempty"`
	// +kubebuilder:validation:Required
	// +kubebuilder:validation:Pattern=^.+\.vcl$
	EntrypointFileName *string `json:"entrypointFileName,omitempty"`
}

func (*VarnishClusterVCL) DeepCopy

func (in *VarnishClusterVCL) DeepCopy() *VarnishClusterVCL

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

func (*VarnishClusterVCL) DeepCopyInto

func (in *VarnishClusterVCL) DeepCopyInto(out *VarnishClusterVCL)

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

type VarnishClusterVarnish

type VarnishClusterVarnish struct {
	Image string `json:"image,omitempty"`
	// +kubebuilder:validation:Enum=Always;Never;IfNotPresent
	ImagePullPolicy           v1.PullPolicy                         `json:"imagePullPolicy,omitempty"`
	ImagePullSecret           string                                `json:"imagePullSecret,omitempty"`
	Resources                 *v1.ResourceRequirements              `json:"resources,omitempty"`
	Args                      []string                              `json:"args,omitempty"`
	Controller                *VarnishClusterVarnishController      `json:"controller,omitempty"`
	MetricsExporter           *VarnishClusterVarnishMetricsExporter `json:"metricsExporter,omitempty"`
	Secret                    *VarnishClusterVarnishSecret          `json:"admAuth,omitempty"`
	EnvFrom                   []v1.EnvFromSource                    `json:"envFrom,omitempty"`
	ExtraInitContainers       []v1.Container                        `json:"extraInitContainers,omitempty"`
	ExtraVolumeClaimTemplates []PVC                                 `json:"extraVolumeClaimTemplates,omitempty"`
	ExtraVolumes              []v1.Volume                           `json:"extraVolumes,omitempty"`
	ExtraVolumeMounts         []v1.VolumeMount                      `json:"extraVolumeMounts,omitempty"`
}

func (*VarnishClusterVarnish) DeepCopy

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

func (*VarnishClusterVarnish) DeepCopyInto

func (in *VarnishClusterVarnish) DeepCopyInto(out *VarnishClusterVarnish)

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

type VarnishClusterVarnishController

type VarnishClusterVarnishController struct {
	Image string `json:"image,omitempty"`
	// +kubebuilder:validation:Enum=Always;Never;IfNotPresent
	ImagePullPolicy v1.PullPolicy           `json:"imagePullPolicy,omitempty"`
	Resources       v1.ResourceRequirements `json:"resources,omitempty"`
}

func (*VarnishClusterVarnishController) DeepCopy

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

func (*VarnishClusterVarnishController) DeepCopyInto

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

type VarnishClusterVarnishMetricsExporter

type VarnishClusterVarnishMetricsExporter struct {
	Image string `json:"image,omitempty"`
	// +kubebuilder:validation:Enum=Always;Never;IfNotPresent
	ImagePullPolicy v1.PullPolicy           `json:"imagePullPolicy,omitempty"`
	Resources       v1.ResourceRequirements `json:"resources,omitempty"`
}

func (*VarnishClusterVarnishMetricsExporter) DeepCopy

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

func (*VarnishClusterVarnishMetricsExporter) DeepCopyInto

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

type VarnishClusterVarnishSecret

type VarnishClusterVarnishSecret struct {
	// +kubebuilder:validation:Required
	// +kubebuilder:validation:MaxLength=253
	// +kubebuilder:validation:Pattern=`^[a-z0-9.-]+$`
	SecretName *string `json:"secretName,omitempty"`
	//+kubebuilder:validation:Pattern=`^[a-zA-Z0-9._-]+$`
	Key *string `json:"key,omitempty"`
}

func (*VarnishClusterVarnishSecret) DeepCopy

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

func (*VarnishClusterVarnishSecret) DeepCopyInto

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