v1

package
v0.0.0-...-e9d93e3 Latest Latest
Warning

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

Go to latest
Published: Feb 5, 2020 License: Apache-2.0 Imports: 4 Imported by: 0

Documentation

Overview

+groupName=console.openshift.io Package v1 is the v1 version of the API.

Index

Constants

This section is empty.

Variables

View Source
var (
	GroupName    = "console.openshift.io"
	GroupVersion = schema.GroupVersion{Group: GroupName, Version: "v1"}

	// Install is a function which adds this version to a scheme
	Install = schemeBuilder.AddToScheme

	// SchemeGroupVersion generated code relies on this name
	// Deprecated
	SchemeGroupVersion = GroupVersion
	// AddToScheme exists solely to keep the old generators creating valid code
	// DEPRECATED
	AddToScheme = schemeBuilder.AddToScheme
)

Functions

func Resource

func Resource(resource string) schema.GroupResource

Resource generated code relies on this being here, but it logically belongs to the group DEPRECATED

Types

type ApplicationMenuSpec

type ApplicationMenuSpec struct {
	// section is the section of the application menu in which the link should appear.
	// This can be any text that will appear as a subheading in the application menu dropdown.
	// A new section will be created if the text does not match text of an existing section.
	Section string `json:"section"`
	// imageUrl is the URL for the icon used in front of the link in the application menu.
	// The URL must be an HTTPS URL or a Data URI. The image should be square and will be shown at 24x24 pixels.
	// +optional
	ImageURL string `json:"imageURL,omitempty"`
}

ApplicationMenuSpec is the specification of the desired section and icon used for the link in the application menu.

func (*ApplicationMenuSpec) DeepCopy

func (in *ApplicationMenuSpec) DeepCopy() *ApplicationMenuSpec

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

func (*ApplicationMenuSpec) DeepCopyInto

func (in *ApplicationMenuSpec) DeepCopyInto(out *ApplicationMenuSpec)

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

func (ApplicationMenuSpec) SwaggerDoc

func (ApplicationMenuSpec) SwaggerDoc() map[string]string
type CLIDownloadLink struct {
	// text is the display text for the link
	// +optional
	Text string `json:"text"`
	// href is the absolute secure URL for the link (must use https)
	// +kubebuilder:validation:Pattern=`^https://`
	Href string `json:"href"`
}

func (*CLIDownloadLink) DeepCopy

func (in *CLIDownloadLink) DeepCopy() *CLIDownloadLink

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

func (*CLIDownloadLink) DeepCopyInto

func (in *CLIDownloadLink) DeepCopyInto(out *CLIDownloadLink)

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

func (CLIDownloadLink) SwaggerDoc

func (CLIDownloadLink) SwaggerDoc() map[string]string

type ConsoleCLIDownload

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

	Spec ConsoleCLIDownloadSpec `json:"spec"`
}

ConsoleCLIDownload is an extension for configuring openshift web console command line interface (CLI) downloads.

func (*ConsoleCLIDownload) DeepCopy

func (in *ConsoleCLIDownload) DeepCopy() *ConsoleCLIDownload

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

func (*ConsoleCLIDownload) DeepCopyInto

func (in *ConsoleCLIDownload) DeepCopyInto(out *ConsoleCLIDownload)

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

func (*ConsoleCLIDownload) DeepCopyObject

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

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

func (ConsoleCLIDownload) SwaggerDoc

func (ConsoleCLIDownload) SwaggerDoc() map[string]string

type ConsoleCLIDownloadList

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

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

func (*ConsoleCLIDownloadList) DeepCopy

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

func (*ConsoleCLIDownloadList) DeepCopyInto

func (in *ConsoleCLIDownloadList) DeepCopyInto(out *ConsoleCLIDownloadList)

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

func (*ConsoleCLIDownloadList) DeepCopyObject

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

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

type ConsoleCLIDownloadSpec

type ConsoleCLIDownloadSpec struct {
	// displayName is the display name of the CLI download.
	DisplayName string `json:"displayName"`
	// description is the description of the CLI download (can include markdown).
	Description string `json:"description"`
	// links is a list of objects that provide CLI download link details.
	Links []CLIDownloadLink `json:"links"`
}

ConsoleCLIDownloadSpec is the desired cli download configuration.

func (*ConsoleCLIDownloadSpec) DeepCopy

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

func (*ConsoleCLIDownloadSpec) DeepCopyInto

func (in *ConsoleCLIDownloadSpec) DeepCopyInto(out *ConsoleCLIDownloadSpec)

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

func (ConsoleCLIDownloadSpec) SwaggerDoc

func (ConsoleCLIDownloadSpec) SwaggerDoc() map[string]string
type ConsoleExternalLogLink struct {
	metav1.TypeMeta   `json:",inline"`
	metav1.ObjectMeta `json:"metadata,omitempty"`

	Spec ConsoleExternalLogLinkSpec `json:"spec"`
}

ConsoleExternalLogLink is an extension for customizing OpenShift web console log links.

func (*ConsoleExternalLogLink) DeepCopy

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

func (*ConsoleExternalLogLink) DeepCopyInto

func (in *ConsoleExternalLogLink) DeepCopyInto(out *ConsoleExternalLogLink)

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

func (*ConsoleExternalLogLink) DeepCopyObject

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

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

func (ConsoleExternalLogLink) SwaggerDoc

func (ConsoleExternalLogLink) SwaggerDoc() map[string]string
type ConsoleExternalLogLinkList struct {
	metav1.TypeMeta `json:",inline"`
	metav1.ListMeta `json:"metadata"`

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

func (*ConsoleExternalLogLinkList) DeepCopy

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

func (*ConsoleExternalLogLinkList) DeepCopyInto

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

func (*ConsoleExternalLogLinkList) DeepCopyObject

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

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

type ConsoleExternalLogLinkSpec

type ConsoleExternalLogLinkSpec struct {
	// text is the display text for the link
	Text string `json:"text"`
	// hrefTemplate is an absolute secure URL (must use https) for the log link including
	// variables to be replaced. Variables are specified in the URL with the format ${variableName},
	// for instance, ${containerName} and will be replaced with the corresponding values
	// from the resource. Resource is a pod.
	// Supported variables are:
	// - ${resourceName} - name of the resource which containes the logs
	// - ${resourceUID} - UID of the resource which contains the logs
	//               - e.g. `11111111-2222-3333-4444-555555555555`
	// - ${containerName} - name of the resource's container that contains the logs
	// - ${resourceNamespace} - namespace of the resource that contains the logs
	// - ${resourceNamespaceUID} - namespace UID of the resource that contains the logs
	// - ${podLabels} - JSON representation of labels matching the pod with the logs
	//             - e.g. `{"key1":"value1","key2":"value2"}`
	//
	// e.g., https://example.com/logs?resourceName=${resourceName}&containerName=${containerName}&resourceNamespace=${resourceNamespace}&podLabels=${podLabels}
	// +kubebuilder:validation:Pattern=`^https://`
	HrefTemplate string `json:"hrefTemplate"`
	// namespaceFilter is a regular expression used to restrict a log link to a
	// matching set of namespaces (e.g., `^openshift-`). The string is converted
	// into a regular expression using the JavaScript RegExp constructor.
	// If not specified, links will be displayed for all the namespaces.
	// +optional
	NamespaceFilter string `json:"namespaceFilter,omitempty"`
}

ConsoleExternalLogLinkSpec is the desired log link configuration. The log link will appear on the logs tab of the pod details page.

func (*ConsoleExternalLogLinkSpec) DeepCopy

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

func (*ConsoleExternalLogLinkSpec) DeepCopyInto

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

func (ConsoleExternalLogLinkSpec) SwaggerDoc

func (ConsoleExternalLogLinkSpec) SwaggerDoc() map[string]string
type ConsoleLink struct {
	metav1.TypeMeta   `json:",inline"`
	metav1.ObjectMeta `json:"metadata,omitempty"`

	Spec ConsoleLinkSpec `json:"spec"`
}

ConsoleLink is an extension for customizing OpenShift web console links.

func (*ConsoleLink) DeepCopy

func (in *ConsoleLink) DeepCopy() *ConsoleLink

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

func (*ConsoleLink) DeepCopyInto

func (in *ConsoleLink) DeepCopyInto(out *ConsoleLink)

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

func (*ConsoleLink) DeepCopyObject

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

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

func (ConsoleLink) SwaggerDoc

func (ConsoleLink) SwaggerDoc() map[string]string
type ConsoleLinkList struct {
	metav1.TypeMeta `json:",inline"`
	metav1.ListMeta `json:"metadata"`

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

func (*ConsoleLinkList) DeepCopy

func (in *ConsoleLinkList) DeepCopy() *ConsoleLinkList

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

func (*ConsoleLinkList) DeepCopyInto

func (in *ConsoleLinkList) DeepCopyInto(out *ConsoleLinkList)

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

func (*ConsoleLinkList) DeepCopyObject

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

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

type ConsoleLinkLocation

type ConsoleLinkLocation string

ConsoleLinkLocationSelector is a set of possible menu targets to which a link may be appended. +kubebuilder:validation:Pattern=`^(ApplicationMenu|HelpMenu|UserMenu|NamespaceDashboard)$`

const (
	// HelpMenu indicates that the link should appear in the help menu in the console.
	HelpMenu ConsoleLinkLocation = "HelpMenu"
	// UserMenu indicates that the link should appear in the user menu in the console.
	UserMenu ConsoleLinkLocation = "UserMenu"
	// ApplicationMenu indicates that the link should appear inside the application menu of the console.
	ApplicationMenu ConsoleLinkLocation = "ApplicationMenu"
	// NamespaceDashboard indicates that the link should appear in the namespaced dashboard of the console.
	NamespaceDashboard ConsoleLinkLocation = "NamespaceDashboard"
)

type ConsoleLinkSpec

type ConsoleLinkSpec struct {
	Link `json:",inline"`
	// location determines which location in the console the link will be appended to (ApplicationMenu, HelpMenu, UserMenu, NamespaceDashboard).
	Location ConsoleLinkLocation `json:"location"`
	// applicationMenu holds information about section and icon used for the link in the
	// application menu, and it is applicable only when location is set to ApplicationMenu.
	//
	// +optional
	ApplicationMenu *ApplicationMenuSpec `json:"applicationMenu,omitempty"`
	// namespaceDashboard holds information about namespaces in which the dashboard link should
	// appear, and it is applicable only when location is set to NamespaceDashboard.
	// If not specified, the link will appear in all namespaces.
	//
	// +optional
	NamespaceDashboard *NamespaceDashboardSpec `json:"namespaceDashboard,omitempty"`
}

ConsoleLinkSpec is the desired console link configuration.

func (*ConsoleLinkSpec) DeepCopy

func (in *ConsoleLinkSpec) DeepCopy() *ConsoleLinkSpec

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

func (*ConsoleLinkSpec) DeepCopyInto

func (in *ConsoleLinkSpec) DeepCopyInto(out *ConsoleLinkSpec)

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

func (ConsoleLinkSpec) SwaggerDoc

func (ConsoleLinkSpec) SwaggerDoc() map[string]string

type ConsoleNotification

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

	Spec ConsoleNotificationSpec `json:"spec"`
}

ConsoleNotification is the extension for configuring openshift web console notifications.

func (*ConsoleNotification) DeepCopy

func (in *ConsoleNotification) DeepCopy() *ConsoleNotification

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

func (*ConsoleNotification) DeepCopyInto

func (in *ConsoleNotification) DeepCopyInto(out *ConsoleNotification)

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

func (*ConsoleNotification) DeepCopyObject

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

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

func (ConsoleNotification) SwaggerDoc

func (ConsoleNotification) SwaggerDoc() map[string]string

type ConsoleNotificationList

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

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

func (*ConsoleNotificationList) DeepCopy

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

func (*ConsoleNotificationList) DeepCopyInto

func (in *ConsoleNotificationList) DeepCopyInto(out *ConsoleNotificationList)

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

func (*ConsoleNotificationList) DeepCopyObject

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

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

type ConsoleNotificationLocation

type ConsoleNotificationLocation string

ConsoleNotificationLocationSelector is a set of possible notification targets to which a notification may be appended. +kubebuilder:validation:Pattern=`^(BannerTop|BannerBottom|BannerTopBottom)$`

const (
	// BannerTop indicates that the notification should appear at the top of the console.
	BannerTop ConsoleNotificationLocation = "BannerTop"
	// BannerBottom indicates that the notification should appear at the bottom of the console.
	BannerBottom ConsoleNotificationLocation = "BannerBottom"
	// BannerTopBottom indicates that the notification should appear both at the top and at the bottom of the console.
	BannerTopBottom ConsoleNotificationLocation = "BannerTopBottom"
)

type ConsoleNotificationSpec

type ConsoleNotificationSpec struct {
	// text is the visible text of the notification.
	Text string `json:"text"`
	// location is the location of the notification in the console.
	// +optional
	Location ConsoleNotificationLocation `json:"location,omitempty"`
	// link is an object that holds notification link details.
	// +optional
	Link *Link `json:"link,omitempty"`
	// color is the color of the text for the notification as CSS data type color.
	// +optional
	Color string `json:"color,omitempty"`
	// backgroundColor is the color of the background for the notification as CSS data type color.
	// +optional
	BackgroundColor string `json:"backgroundColor,omitempty"`
}

ConsoleNotificationSpec is the desired console notification configuration.

func (*ConsoleNotificationSpec) DeepCopy

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

func (*ConsoleNotificationSpec) DeepCopyInto

func (in *ConsoleNotificationSpec) DeepCopyInto(out *ConsoleNotificationSpec)

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

func (ConsoleNotificationSpec) SwaggerDoc

func (ConsoleNotificationSpec) SwaggerDoc() map[string]string

type ConsoleYAMLSample

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

	Spec ConsoleYAMLSampleSpec `json:"spec"`
}

ConsoleYAMLSample is an extension for customizing OpenShift web console YAML samples.

func (*ConsoleYAMLSample) DeepCopy

func (in *ConsoleYAMLSample) DeepCopy() *ConsoleYAMLSample

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

func (*ConsoleYAMLSample) DeepCopyInto

func (in *ConsoleYAMLSample) DeepCopyInto(out *ConsoleYAMLSample)

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

func (*ConsoleYAMLSample) DeepCopyObject

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

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

func (ConsoleYAMLSample) SwaggerDoc

func (ConsoleYAMLSample) SwaggerDoc() map[string]string

type ConsoleYAMLSampleDescription

type ConsoleYAMLSampleDescription string

ConsoleYAMLSampleDescription of the YAML sample. +kubebuilder:validation:Pattern=`^(.|\s)*\S(.|\s)*$`

type ConsoleYAMLSampleList

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

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

func (*ConsoleYAMLSampleList) DeepCopy

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

func (*ConsoleYAMLSampleList) DeepCopyInto

func (in *ConsoleYAMLSampleList) DeepCopyInto(out *ConsoleYAMLSampleList)

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

func (*ConsoleYAMLSampleList) DeepCopyObject

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

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

type ConsoleYAMLSampleSpec

type ConsoleYAMLSampleSpec struct {
	// targetResource contains apiVersion and kind of the resource
	// YAML sample is representating.
	TargetResource metav1.TypeMeta `json:"targetResource"`
	// title of the YAML sample.
	Title ConsoleYAMLSampleTitle `json:"title"`
	// description of the YAML sample.
	Description ConsoleYAMLSampleDescription `json:"description"`
	// yaml is the YAML sample to display.
	YAML ConsoleYAMLSampleYAML `json:"yaml"`
	// snippet indicates that the YAML sample is not the full YAML resource
	// definition, but a fragment that can be inserted into the existing
	// YAML document at the user's cursor.
	// +optional
	Snippet bool `json:"snippet"`
}

ConsoleYAMLSampleSpec is the desired YAML sample configuration. Samples will appear with their descriptions in a samples sidebar when creating a resources in the web console.

func (*ConsoleYAMLSampleSpec) DeepCopy

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

func (*ConsoleYAMLSampleSpec) DeepCopyInto

func (in *ConsoleYAMLSampleSpec) DeepCopyInto(out *ConsoleYAMLSampleSpec)

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

func (ConsoleYAMLSampleSpec) SwaggerDoc

func (ConsoleYAMLSampleSpec) SwaggerDoc() map[string]string

type ConsoleYAMLSampleTitle

type ConsoleYAMLSampleTitle string

ConsoleYAMLSampleTitle of the YAML sample. +kubebuilder:validation:Pattern=`^(.|\s)*\S(.|\s)*$`

type ConsoleYAMLSampleYAML

type ConsoleYAMLSampleYAML string

ConsoleYAMLSampleYAML is the YAML sample to display. +kubebuilder:validation:Pattern=`^(.|\s)*\S(.|\s)*$`

type Link struct {
	// text is the display text for the link
	Text string `json:"text"`
	// href is the absolute secure URL for the link (must use https)
	// +kubebuilder:validation:Pattern=`^https://`
	Href string `json:"href"`
}

Represents a standard link that could be generated in HTML

func (*Link) DeepCopy

func (in *Link) DeepCopy() *Link

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

func (*Link) DeepCopyInto

func (in *Link) DeepCopyInto(out *Link)

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

func (Link) SwaggerDoc

func (Link) SwaggerDoc() map[string]string

type NamespaceDashboardSpec

type NamespaceDashboardSpec struct {
	// namespaces is an array of namespace names in which the dashboard link should appear.
	//
	// +optional
	Namespaces []string `json:"namespaces,omitempty"`
	// namespaceSelector is used to select the Namespaces that should contain dashboard link by label.
	// If the namespace labels match, dashboard link will be shown for the namespaces.
	//
	// +optional
	NamespaceSelector *metav1.LabelSelector `json:"namespaceSelector,omitempty"`
}

NamespaceDashboardSpec is a specification of namespaces in which the dashboard link should appear. If both namespaces and namespaceSelector are specified, the link will appear in namespaces that match either

func (*NamespaceDashboardSpec) DeepCopy

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

func (*NamespaceDashboardSpec) DeepCopyInto

func (in *NamespaceDashboardSpec) DeepCopyInto(out *NamespaceDashboardSpec)

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

func (NamespaceDashboardSpec) SwaggerDoc

func (NamespaceDashboardSpec) SwaggerDoc() map[string]string

Jump to

Keyboard shortcuts

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