v1

package
v0.12.0-m3 Latest Latest
Warning

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

Go to latest
Published: Jan 11, 2022 License: Apache-2.0 Imports: 9 Imported by: 17

Documentation

Index

Constants

View Source
const (
	GatewayConfigPrefix     = "gateway.submariner.io/"
	UDPPortConfig           = "udp-port"
	NATTDiscoveryPortConfig = "natt-discovery-port"
	PreferredServerConfig   = "preferred-server"
	PublicIP                = "public-ip"
	UsingLoadBalancer       = "using-loadbalancer"
)
View Source
const (
	DefaultNATTDiscoveryPort = "4490"
	DefaultUDPPort           = "4500"
)
View Source
const (
	IPv4         = "ipv4" // ipv4:1.2.3.4
	LoadBalancer = "lb"   // lb:external-gw-lb
	API          = "api"  // api:api.ipify.org
	DNS          = "dns"  // dns:mygateway.dns.name.com
)

Valid PublicIP resolvers.

Variables

View Source
var (
	SchemeBuilder = runtime.NewSchemeBuilder(addKnownTypes)
	AddToScheme   = SchemeBuilder.AddToScheme
)
View Source
var SchemeGroupVersion = schema.GroupVersion{Group: "submariner.io", Version: "v1"}

SchemeGroupVersion is group version used to register these objects.

ValidGatewayNodeConfig list should contain only keys that configure node specific settings via labels.

Functions

func Kind

func Kind(kind string) schema.GroupKind

Kind takes an unqualified kind and returns back a Group qualified GroupKind.

func Resource

func Resource(resource string) schema.GroupResource

Resource takes an unqualified resource and returns a Group qualified GroupResource.

Types

type Cluster

type Cluster struct {
	metav1.TypeMeta   `json:",inline"`
	metav1.ObjectMeta `json:"metadata,omitempty"`
	Spec              ClusterSpec `json:"spec"`
}

func (*Cluster) DeepCopy

func (in *Cluster) DeepCopy() *Cluster

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

func (*Cluster) DeepCopyInto

func (in *Cluster) DeepCopyInto(out *Cluster)

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

func (*Cluster) DeepCopyObject

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

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

type ClusterGlobalEgressIP added in v0.10.1

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

	// Spec is the specification of desired behavior.
	Spec ClusterGlobalEgressIPSpec `json:"spec"`

	// The most recently observed status. Read-only.
	// +optional
	Status GlobalEgressIPStatus `json:"status,omitempty"`
}

+genclient +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object +kubebuilder:resource:scope="Cluster",shortName="cgeip" ClusterGlobalEgressIP defines a policy for allocating GlobalIPs at the cluster level to be used when no GlobalEgressIP applies.

func (*ClusterGlobalEgressIP) DeepCopy added in v0.10.1

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

func (*ClusterGlobalEgressIP) DeepCopyInto added in v0.10.1

func (in *ClusterGlobalEgressIP) DeepCopyInto(out *ClusterGlobalEgressIP)

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

func (*ClusterGlobalEgressIP) DeepCopyObject added in v0.10.1

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

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

type ClusterGlobalEgressIPList added in v0.10.1

type ClusterGlobalEgressIPList struct {
	metav1.TypeMeta `json:",inline"`
	metav1.ListMeta `json:"metadata"`

	Items []ClusterGlobalEgressIP `json:"items"`
}

func (*ClusterGlobalEgressIPList) DeepCopy added in v0.10.1

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

func (*ClusterGlobalEgressIPList) DeepCopyInto added in v0.10.1

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

func (*ClusterGlobalEgressIPList) DeepCopyObject added in v0.10.1

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

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

type ClusterGlobalEgressIPSpec added in v0.10.1

type ClusterGlobalEgressIPSpec struct {
	// The requested number of contiguous GlobalIPs to allocate from the Globalnet CIDR assigned to the cluster.
	// If not specified, defaults to 1.
	// +kubebuilder:validation:Minimum=0
	// +kubebuilder:validation:Maximum=20
	// +optional
	NumberOfIPs *int `json:"numGlobalIPs,omitempty"`
}

func (*ClusterGlobalEgressIPSpec) DeepCopy added in v0.10.1

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

func (*ClusterGlobalEgressIPSpec) DeepCopyInto added in v0.10.1

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

type ClusterList

type ClusterList struct {
	metav1.TypeMeta `json:",inline"`
	metav1.ListMeta `json:"metadata"`
	Items           []Cluster `json:"items"`
}

func (*ClusterList) DeepCopy

func (in *ClusterList) DeepCopy() *ClusterList

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

func (*ClusterList) DeepCopyInto

func (in *ClusterList) DeepCopyInto(out *ClusterList)

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

func (*ClusterList) DeepCopyObject

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

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

type ClusterSpec

type ClusterSpec struct {
	// +kubebuilder:validation:MaxLength=63
	// +kubebuilder:validation:MinLength=1
	ClusterID   string   `json:"cluster_id"` // perhaps this could just be a hash of the name...?
	ColorCodes  []string `json:"color_codes"`
	ServiceCIDR []string `json:"service_cidr"`
	ClusterCIDR []string `json:"cluster_cidr"`
	GlobalCIDR  []string `json:"global_cidr"`
}

func (*ClusterSpec) DeepCopy

func (in *ClusterSpec) DeepCopy() *ClusterSpec

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

func (*ClusterSpec) DeepCopyInto

func (in *ClusterSpec) DeepCopyInto(out *ClusterSpec)

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

type Connection added in v0.3.0

type Connection struct {
	Status        ConnectionStatus `json:"status"`
	StatusMessage string           `json:"statusMessage"`
	Endpoint      EndpointSpec     `json:"endpoint"`
	UsingIP       string           `json:"usingIP,omitempty"`
	UsingNAT      bool             `json:"usingNAT,omitempty"`
	// +optional
	LatencyRTT *LatencyRTTSpec `json:"latencyRTT,omitempty"`
}

func NewConnection added in v0.3.0

func NewConnection(endpointSpec *EndpointSpec, usedIP string, nat bool) *Connection

func (*Connection) DeepCopy added in v0.3.0

func (in *Connection) DeepCopy() *Connection

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

func (*Connection) DeepCopyInto added in v0.3.0

func (in *Connection) DeepCopyInto(out *Connection)

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

func (*Connection) SetStatus added in v0.3.0

func (c *Connection) SetStatus(status ConnectionStatus, messageFormat string, a ...interface{})

type ConnectionStatus added in v0.3.0

type ConnectionStatus string
const (
	Connected       ConnectionStatus = "connected"
	Connecting      ConnectionStatus = "connecting"
	ConnectionError ConnectionStatus = "error"
)

type Endpoint

type Endpoint struct {
	metav1.TypeMeta   `json:",inline"`
	metav1.ObjectMeta `json:"metadata,omitempty"`
	Spec              EndpointSpec `json:"spec"`
}

func (*Endpoint) DeepCopy

func (in *Endpoint) DeepCopy() *Endpoint

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

func (*Endpoint) DeepCopyInto

func (in *Endpoint) DeepCopyInto(out *Endpoint)

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

func (*Endpoint) DeepCopyObject

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

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

func (*Endpoint) GatewayIP added in v0.8.1

func (ep *Endpoint) GatewayIP() net.IP

func (*Endpoint) String added in v0.1.1

func (ep *Endpoint) String() string

String method returns a string representation, for human readability.

type EndpointList

type EndpointList struct {
	metav1.TypeMeta `json:",inline"`
	metav1.ListMeta `json:"metadata"`
	Items           []Endpoint `json:"items"`
}

func (*EndpointList) DeepCopy

func (in *EndpointList) DeepCopy() *EndpointList

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

func (*EndpointList) DeepCopyInto

func (in *EndpointList) DeepCopyInto(out *EndpointList)

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

func (*EndpointList) DeepCopyObject

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

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

type EndpointSpec

type EndpointSpec struct {
	// +kubebuilder:validation:MaxLength=63
	// +kubebuilder:validation:MinLength=1
	ClusterID string `json:"cluster_id"`
	CableName string `json:"cable_name"`
	// +optional
	HealthCheckIP string            `json:"healthCheckIP,omitempty"`
	Hostname      string            `json:"hostname"`
	Subnets       []string          `json:"subnets"`
	PrivateIP     string            `json:"private_ip"`
	PublicIP      string            `json:"public_ip"`
	NATEnabled    bool              `json:"nat_enabled"`
	Backend       string            `json:"backend"`
	BackendConfig map[string]string `json:"backend_config,omitempty"`
}

func (*EndpointSpec) DeepCopy

func (in *EndpointSpec) DeepCopy() *EndpointSpec

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

func (*EndpointSpec) DeepCopyInto

func (in *EndpointSpec) DeepCopyInto(out *EndpointSpec)

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

func (*EndpointSpec) GetBackendBool added in v0.9.0

func (ep *EndpointSpec) GetBackendBool(configName string, defaultValue *bool) (*bool, error)

func (*EndpointSpec) GetBackendPort added in v0.9.0

func (ep *EndpointSpec) GetBackendPort(configName string, defaultValue int32) (int32, error)

type Gateway added in v0.3.0

type Gateway struct {
	metav1.TypeMeta   `json:",inline"`
	metav1.ObjectMeta `json:"metadata,omitempty"`
	Status            GatewayStatus `json:"status"`
}

func (*Gateway) DeepCopy added in v0.3.0

func (in *Gateway) DeepCopy() *Gateway

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

func (*Gateway) DeepCopyInto added in v0.3.0

func (in *Gateway) DeepCopyInto(out *Gateway)

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

func (*Gateway) DeepCopyObject added in v0.3.0

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

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

type GatewayList added in v0.3.0

type GatewayList struct {
	metav1.TypeMeta `json:",inline"`
	metav1.ListMeta `json:"metadata"`
	Items           []Gateway `json:"items"`
}

func (*GatewayList) DeepCopy added in v0.3.0

func (in *GatewayList) DeepCopy() *GatewayList

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

func (*GatewayList) DeepCopyInto added in v0.3.0

func (in *GatewayList) DeepCopyInto(out *GatewayList)

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

func (*GatewayList) DeepCopyObject added in v0.3.0

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

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

type GatewayStatus added in v0.3.0

type GatewayStatus struct {
	Version       string       `json:"version"`
	HAStatus      HAStatus     `json:"haStatus"`
	LocalEndpoint EndpointSpec `json:"localEndpoint"`
	StatusFailure string       `json:"statusFailure"`
	Connections   []Connection `json:"connections"`
}

func (*GatewayStatus) DeepCopy added in v0.3.0

func (in *GatewayStatus) DeepCopy() *GatewayStatus

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

func (*GatewayStatus) DeepCopyInto added in v0.3.0

func (in *GatewayStatus) DeepCopyInto(out *GatewayStatus)

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

type GlobalEgressIP added in v0.10.1

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

	// Spec is the specification of the desired behavior.
	Spec GlobalEgressIPSpec `json:"spec"`

	// The most recently observed status. Read-only.
	// +optional
	Status GlobalEgressIPStatus `json:"status,omitempty"`
}

GlobalEgressIP defines a policy for allocating GlobalIPs for selected pods in the namespace of the GlobalEgressIP object.

func (*GlobalEgressIP) DeepCopy added in v0.10.1

func (in *GlobalEgressIP) DeepCopy() *GlobalEgressIP

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

func (*GlobalEgressIP) DeepCopyInto added in v0.10.1

func (in *GlobalEgressIP) DeepCopyInto(out *GlobalEgressIP)

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

func (*GlobalEgressIP) DeepCopyObject added in v0.10.1

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

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

type GlobalEgressIPConditionType added in v0.10.1

type GlobalEgressIPConditionType string
const (
	GlobalEgressIPAllocated GlobalEgressIPConditionType = "Allocated"
	GlobalEgressIPUpdated   GlobalEgressIPConditionType = "Updated"
)

type GlobalEgressIPList added in v0.10.1

type GlobalEgressIPList struct {
	metav1.TypeMeta `json:",inline"`
	metav1.ListMeta `json:"metadata"`

	Items []GlobalEgressIP `json:"items"`
}

func (*GlobalEgressIPList) DeepCopy added in v0.10.1

func (in *GlobalEgressIPList) DeepCopy() *GlobalEgressIPList

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

func (*GlobalEgressIPList) DeepCopyInto added in v0.10.1

func (in *GlobalEgressIPList) DeepCopyInto(out *GlobalEgressIPList)

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

func (*GlobalEgressIPList) DeepCopyObject added in v0.10.1

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

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

type GlobalEgressIPSpec added in v0.10.1

type GlobalEgressIPSpec struct {
	// The requested number of contiguous GlobalIPs to allocate from the Globalnet CIDR assigned to the cluster.
	// If not specified, defaults to 1.
	// +kubebuilder:validation:Minimum=0
	// +kubebuilder:validation:Maximum=20
	// +optional
	NumberOfIPs *int `json:"numberOfIPs,omitempty"`

	// Selects specific pods in the namespace of this GlobalEgressIP to which this GlobalEgressIP applies. If not specified,
	// all pods in the namespace are selected.
	// If a pod matches multiple GlobalEgressIP objects, there is no guarantee from which GlobalEgressIP its
	// GlobalIP will be assigned.
	// +optional
	PodSelector *metav1.LabelSelector `json:"podSelector,omitempty"`
}

func (*GlobalEgressIPSpec) DeepCopy added in v0.10.1

func (in *GlobalEgressIPSpec) DeepCopy() *GlobalEgressIPSpec

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

func (*GlobalEgressIPSpec) DeepCopyInto added in v0.10.1

func (in *GlobalEgressIPSpec) DeepCopyInto(out *GlobalEgressIPSpec)

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

type GlobalEgressIPStatus added in v0.10.1

type GlobalEgressIPStatus struct {
	// +optional
	Conditions []metav1.Condition `json:"conditions,omitempty"`

	// The list of allocated GlobalIPs.
	// +optional
	AllocatedIPs []string `json:"allocatedIPs,omitempty"`
}

func (*GlobalEgressIPStatus) DeepCopy added in v0.10.1

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

func (*GlobalEgressIPStatus) DeepCopyInto added in v0.10.1

func (in *GlobalEgressIPStatus) DeepCopyInto(out *GlobalEgressIPStatus)

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

type GlobalIngressIP added in v0.10.1

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

	// Spec is the specification of desired behavior of GlobalIngressIP object.
	Spec GlobalIngressIPSpec `json:"spec"`

	// Observed status of GlobalIngressIP. Its a read-only field.
	// +optional
	Status GlobalIngressIPStatus `json:"status,omitempty"`
}

func (*GlobalIngressIP) DeepCopy added in v0.10.1

func (in *GlobalIngressIP) DeepCopy() *GlobalIngressIP

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

func (*GlobalIngressIP) DeepCopyInto added in v0.10.1

func (in *GlobalIngressIP) DeepCopyInto(out *GlobalIngressIP)

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

func (*GlobalIngressIP) DeepCopyObject added in v0.10.1

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

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

type GlobalIngressIPList added in v0.10.1

type GlobalIngressIPList struct {
	metav1.TypeMeta `json:",inline"`
	metav1.ListMeta `json:"metadata"`

	Items []GlobalIngressIP `json:"items"`
}

func (*GlobalIngressIPList) DeepCopy added in v0.10.1

func (in *GlobalIngressIPList) DeepCopy() *GlobalIngressIPList

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

func (*GlobalIngressIPList) DeepCopyInto added in v0.10.1

func (in *GlobalIngressIPList) DeepCopyInto(out *GlobalIngressIPList)

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

func (*GlobalIngressIPList) DeepCopyObject added in v0.10.1

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

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

type GlobalIngressIPSpec added in v0.10.1

type GlobalIngressIPSpec struct {
	// Specifies the type of the entity targeted by this object.
	Target TargetType `json:"target"`

	// The reference to a targeted Service, if applicable.
	// +Optional
	ServiceRef *corev1.LocalObjectReference `json:"serviceRef,omitempty"`

	// The reference to a targeted Pod, if applicable.
	// +Optional
	PodRef *corev1.LocalObjectReference `json:"podRef,omitempty"`
}

func (*GlobalIngressIPSpec) DeepCopy added in v0.10.1

func (in *GlobalIngressIPSpec) DeepCopy() *GlobalIngressIPSpec

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

func (*GlobalIngressIPSpec) DeepCopyInto added in v0.10.1

func (in *GlobalIngressIPSpec) DeepCopyInto(out *GlobalIngressIPSpec)

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

type GlobalIngressIPStatus added in v0.10.1

type GlobalIngressIPStatus struct {
	// +optional
	Conditions []metav1.Condition `json:"conditions,omitempty"`

	// The GlobalIP allocated to this object.
	// +optional
	AllocatedIP string `json:"allocatedIP"`
}

func (*GlobalIngressIPStatus) DeepCopy added in v0.10.1

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

func (*GlobalIngressIPStatus) DeepCopyInto added in v0.10.1

func (in *GlobalIngressIPStatus) DeepCopyInto(out *GlobalIngressIPStatus)

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

type HAStatus added in v0.3.0

type HAStatus string
const (
	HAStatusActive  HAStatus = "active"
	HAStatusPassive HAStatus = "passive"
)

type LatencyRTTSpec added in v0.8.0

type LatencyRTTSpec struct {
	Last    string `json:"last,omitempty"`
	Min     string `json:"min,omitempty"`
	Average string `json:"average,omitempty"`
	Max     string `json:"max,omitempty"`
	StdDev  string `json:"stdDev,omitempty"`
}

LatencySpec describes the round trip time information for a packet between the gateway pods of two clusters.

func (*LatencyRTTSpec) DeepCopy added in v0.8.0

func (in *LatencyRTTSpec) DeepCopy() *LatencyRTTSpec

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

func (*LatencyRTTSpec) DeepCopyInto added in v0.8.0

func (in *LatencyRTTSpec) DeepCopyInto(out *LatencyRTTSpec)

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

type TargetType added in v0.10.1

type TargetType string
const (
	ClusterIPService   TargetType = "ClusterIPService"
	HeadlessServicePod TargetType = "HeadlessServicePod"
)

Jump to

Keyboard shortcuts

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