v1alpha1

package
v0.8.0 Latest Latest
Warning

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

Go to latest
Published: Mar 15, 2024 License: Apache-2.0 Imports: 10 Imported by: 0

Documentation

Overview

+kubebuilder:object:generate=true +groupName=tag.pagerduty.crossplane.io +versionName=v1alpha1

Index

Constants

View Source
const (
	CRDGroup   = "tag.pagerduty.crossplane.io"
	CRDVersion = "v1alpha1"
)

Package type metadata.

Variables

View Source
var (
	Assignment_Kind             = "Assignment"
	Assignment_GroupKind        = schema.GroupKind{Group: CRDGroup, Kind: Assignment_Kind}.String()
	Assignment_KindAPIVersion   = Assignment_Kind + "." + CRDGroupVersion.String()
	Assignment_GroupVersionKind = CRDGroupVersion.WithKind(Assignment_Kind)
)

Repository type metadata.

View Source
var (
	// CRDGroupVersion is the API Group Version used to register the objects
	CRDGroupVersion = schema.GroupVersion{Group: CRDGroup, Version: CRDVersion}

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

	// AddToScheme adds the types in this group-version to the given scheme.
	AddToScheme = SchemeBuilder.AddToScheme
)
View Source
var (
	Tag_Kind             = "Tag"
	Tag_GroupKind        = schema.GroupKind{Group: CRDGroup, Kind: Tag_Kind}.String()
	Tag_KindAPIVersion   = Tag_Kind + "." + CRDGroupVersion.String()
	Tag_GroupVersionKind = CRDGroupVersion.WithKind(Tag_Kind)
)

Repository type metadata.

Functions

This section is empty.

Types

type Assignment

type Assignment struct {
	metav1.TypeMeta   `json:",inline"`
	metav1.ObjectMeta `json:"metadata,omitempty"`
	// +kubebuilder:validation:XValidation:rule="!('*' in self.managementPolicies || 'Create' in self.managementPolicies || 'Update' in self.managementPolicies) || has(self.forProvider.entityId) || (has(self.initProvider) && has(self.initProvider.entityId))",message="spec.forProvider.entityId is a required parameter"
	// +kubebuilder:validation:XValidation:rule="!('*' in self.managementPolicies || 'Create' in self.managementPolicies || 'Update' in self.managementPolicies) || has(self.forProvider.entityType) || (has(self.initProvider) && has(self.initProvider.entityType))",message="spec.forProvider.entityType is a required parameter"
	// +kubebuilder:validation:XValidation:rule="!('*' in self.managementPolicies || 'Create' in self.managementPolicies || 'Update' in self.managementPolicies) || has(self.forProvider.tagId) || (has(self.initProvider) && has(self.initProvider.tagId))",message="spec.forProvider.tagId is a required parameter"
	Spec   AssignmentSpec   `json:"spec"`
	Status AssignmentStatus `json:"status,omitempty"`
}

Assignment is the Schema for the Assignments API. Creates and manages a tag assignment in PagerDuty. +kubebuilder:printcolumn:name="READY",type="string",JSONPath=".status.conditions[?(@.type=='Ready')].status" +kubebuilder:printcolumn:name="SYNCED",type="string",JSONPath=".status.conditions[?(@.type=='Synced')].status" +kubebuilder:printcolumn:name="EXTERNAL-NAME",type="string",JSONPath=".metadata.annotations.crossplane\\.io/external-name" +kubebuilder:printcolumn:name="AGE",type="date",JSONPath=".metadata.creationTimestamp" +kubebuilder:resource:scope=Cluster,categories={crossplane,managed,pagerduty}

func (*Assignment) DeepCopy

func (in *Assignment) DeepCopy() *Assignment

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

func (*Assignment) DeepCopyInto

func (in *Assignment) DeepCopyInto(out *Assignment)

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

func (*Assignment) DeepCopyObject

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

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

func (*Assignment) GetCondition

func (mg *Assignment) GetCondition(ct xpv1.ConditionType) xpv1.Condition

GetCondition of this Assignment.

func (*Assignment) GetConnectionDetailsMapping

func (tr *Assignment) GetConnectionDetailsMapping() map[string]string

GetConnectionDetailsMapping for this Assignment

func (*Assignment) GetDeletionPolicy

func (mg *Assignment) GetDeletionPolicy() xpv1.DeletionPolicy

GetDeletionPolicy of this Assignment.

func (*Assignment) GetID

func (tr *Assignment) GetID() string

GetID returns ID of underlying Terraform resource of this Assignment

func (*Assignment) GetInitParameters added in v0.5.0

func (tr *Assignment) GetInitParameters() (map[string]any, error)

GetInitParameters of this Assignment

func (*Assignment) GetManagementPolicies added in v0.5.0

func (mg *Assignment) GetManagementPolicies() xpv1.ManagementPolicies

GetManagementPolicies of this Assignment.

func (*Assignment) GetMergedParameters added in v0.8.0

func (tr *Assignment) GetMergedParameters(shouldMergeInitProvider bool) (map[string]any, error)

GetInitParameters of this Assignment

func (*Assignment) GetObservation

func (tr *Assignment) GetObservation() (map[string]any, error)

GetObservation of this Assignment

func (*Assignment) GetParameters

func (tr *Assignment) GetParameters() (map[string]any, error)

GetParameters of this Assignment

func (*Assignment) GetProviderConfigReference

func (mg *Assignment) GetProviderConfigReference() *xpv1.Reference

GetProviderConfigReference of this Assignment.

func (*Assignment) GetPublishConnectionDetailsTo

func (mg *Assignment) GetPublishConnectionDetailsTo() *xpv1.PublishConnectionDetailsTo

GetPublishConnectionDetailsTo of this Assignment.

func (*Assignment) GetTerraformResourceType

func (mg *Assignment) GetTerraformResourceType() string

GetTerraformResourceType returns Terraform resource type for this Assignment

func (*Assignment) GetTerraformSchemaVersion

func (tr *Assignment) GetTerraformSchemaVersion() int

GetTerraformSchemaVersion returns the associated Terraform schema version

func (*Assignment) GetWriteConnectionSecretToReference

func (mg *Assignment) GetWriteConnectionSecretToReference() *xpv1.SecretReference

GetWriteConnectionSecretToReference of this Assignment.

func (*Assignment) Hub added in v0.8.0

func (tr *Assignment) Hub()

Hub marks this type as a conversion hub.

func (*Assignment) LateInitialize

func (tr *Assignment) LateInitialize(attrs []byte) (bool, error)

LateInitialize this Assignment using its observed tfState. returns True if there are any spec changes for the resource.

func (*Assignment) SetConditions

func (mg *Assignment) SetConditions(c ...xpv1.Condition)

SetConditions of this Assignment.

func (*Assignment) SetDeletionPolicy

func (mg *Assignment) SetDeletionPolicy(r xpv1.DeletionPolicy)

SetDeletionPolicy of this Assignment.

func (*Assignment) SetManagementPolicies added in v0.5.0

func (mg *Assignment) SetManagementPolicies(r xpv1.ManagementPolicies)

SetManagementPolicies of this Assignment.

func (*Assignment) SetObservation

func (tr *Assignment) SetObservation(obs map[string]any) error

SetObservation for this Assignment

func (*Assignment) SetParameters

func (tr *Assignment) SetParameters(params map[string]any) error

SetParameters for this Assignment

func (*Assignment) SetProviderConfigReference

func (mg *Assignment) SetProviderConfigReference(r *xpv1.Reference)

SetProviderConfigReference of this Assignment.

func (*Assignment) SetPublishConnectionDetailsTo

func (mg *Assignment) SetPublishConnectionDetailsTo(r *xpv1.PublishConnectionDetailsTo)

SetPublishConnectionDetailsTo of this Assignment.

func (*Assignment) SetWriteConnectionSecretToReference

func (mg *Assignment) SetWriteConnectionSecretToReference(r *xpv1.SecretReference)

SetWriteConnectionSecretToReference of this Assignment.

type AssignmentInitParameters added in v0.5.0

type AssignmentInitParameters struct {

	// The ID of the entity.
	EntityID *string `json:"entityId,omitempty" tf:"entity_id,omitempty"`

	// Type of entity in the tag assignment. Possible values can be users, teams, and escalation_policies.
	EntityType *string `json:"entityType,omitempty" tf:"entity_type,omitempty"`

	// The ID of the tag.
	TagID *string `json:"tagId,omitempty" tf:"tag_id,omitempty"`
}

func (*AssignmentInitParameters) DeepCopy added in v0.5.0

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

func (*AssignmentInitParameters) DeepCopyInto added in v0.5.0

func (in *AssignmentInitParameters) DeepCopyInto(out *AssignmentInitParameters)

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

type AssignmentList

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

AssignmentList contains a list of Assignments

func (*AssignmentList) DeepCopy

func (in *AssignmentList) DeepCopy() *AssignmentList

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

func (*AssignmentList) DeepCopyInto

func (in *AssignmentList) DeepCopyInto(out *AssignmentList)

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

func (*AssignmentList) DeepCopyObject

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

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

func (*AssignmentList) GetItems

func (l *AssignmentList) GetItems() []resource.Managed

GetItems of this AssignmentList.

type AssignmentObservation

type AssignmentObservation struct {

	// The ID of the entity.
	EntityID *string `json:"entityId,omitempty" tf:"entity_id,omitempty"`

	// Type of entity in the tag assignment. Possible values can be users, teams, and escalation_policies.
	EntityType *string `json:"entityType,omitempty" tf:"entity_type,omitempty"`

	// The ID of the tag assignment.
	ID *string `json:"id,omitempty" tf:"id,omitempty"`

	// The ID of the tag.
	TagID *string `json:"tagId,omitempty" tf:"tag_id,omitempty"`
}

func (*AssignmentObservation) DeepCopy

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

func (*AssignmentObservation) DeepCopyInto

func (in *AssignmentObservation) DeepCopyInto(out *AssignmentObservation)

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

type AssignmentParameters

type AssignmentParameters struct {

	// The ID of the entity.
	// +kubebuilder:validation:Optional
	EntityID *string `json:"entityId,omitempty" tf:"entity_id,omitempty"`

	// Type of entity in the tag assignment. Possible values can be users, teams, and escalation_policies.
	// +kubebuilder:validation:Optional
	EntityType *string `json:"entityType,omitempty" tf:"entity_type,omitempty"`

	// The ID of the tag.
	// +kubebuilder:validation:Optional
	TagID *string `json:"tagId,omitempty" tf:"tag_id,omitempty"`
}

func (*AssignmentParameters) DeepCopy

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

func (*AssignmentParameters) DeepCopyInto

func (in *AssignmentParameters) DeepCopyInto(out *AssignmentParameters)

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

type AssignmentSpec

type AssignmentSpec struct {
	v1.ResourceSpec `json:",inline"`
	ForProvider     AssignmentParameters `json:"forProvider"`
	// THIS IS A BETA FIELD. It will be honored
	// unless the Management Policies feature flag is disabled.
	// InitProvider holds the same fields as ForProvider, with the exception
	// of Identifier and other resource reference fields. The fields that are
	// in InitProvider are merged into ForProvider when the resource is created.
	// The same fields are also added to the terraform ignore_changes hook, to
	// avoid updating them after creation. This is useful for fields that are
	// required on creation, but we do not desire to update them after creation,
	// for example because of an external controller is managing them, like an
	// autoscaler.
	InitProvider AssignmentInitParameters `json:"initProvider,omitempty"`
}

AssignmentSpec defines the desired state of Assignment

func (*AssignmentSpec) DeepCopy

func (in *AssignmentSpec) DeepCopy() *AssignmentSpec

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

func (*AssignmentSpec) DeepCopyInto

func (in *AssignmentSpec) DeepCopyInto(out *AssignmentSpec)

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

type AssignmentStatus

type AssignmentStatus struct {
	v1.ResourceStatus `json:",inline"`
	AtProvider        AssignmentObservation `json:"atProvider,omitempty"`
}

AssignmentStatus defines the observed state of Assignment.

func (*AssignmentStatus) DeepCopy

func (in *AssignmentStatus) DeepCopy() *AssignmentStatus

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

func (*AssignmentStatus) DeepCopyInto

func (in *AssignmentStatus) DeepCopyInto(out *AssignmentStatus)

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

type Tag

type Tag struct {
	metav1.TypeMeta   `json:",inline"`
	metav1.ObjectMeta `json:"metadata,omitempty"`
	// +kubebuilder:validation:XValidation:rule="!('*' in self.managementPolicies || 'Create' in self.managementPolicies || 'Update' in self.managementPolicies) || has(self.forProvider.label) || (has(self.initProvider) && has(self.initProvider.label))",message="spec.forProvider.label is a required parameter"
	Spec   TagSpec   `json:"spec"`
	Status TagStatus `json:"status,omitempty"`
}

Tag is the Schema for the Tags API. Creates and manages a tag in PagerDuty. +kubebuilder:printcolumn:name="READY",type="string",JSONPath=".status.conditions[?(@.type=='Ready')].status" +kubebuilder:printcolumn:name="SYNCED",type="string",JSONPath=".status.conditions[?(@.type=='Synced')].status" +kubebuilder:printcolumn:name="EXTERNAL-NAME",type="string",JSONPath=".metadata.annotations.crossplane\\.io/external-name" +kubebuilder:printcolumn:name="AGE",type="date",JSONPath=".metadata.creationTimestamp" +kubebuilder:resource:scope=Cluster,categories={crossplane,managed,pagerduty}

func (*Tag) DeepCopy

func (in *Tag) DeepCopy() *Tag

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

func (*Tag) DeepCopyInto

func (in *Tag) DeepCopyInto(out *Tag)

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

func (*Tag) DeepCopyObject

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

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

func (*Tag) GetCondition

func (mg *Tag) GetCondition(ct xpv1.ConditionType) xpv1.Condition

GetCondition of this Tag.

func (*Tag) GetConnectionDetailsMapping

func (tr *Tag) GetConnectionDetailsMapping() map[string]string

GetConnectionDetailsMapping for this Tag

func (*Tag) GetDeletionPolicy

func (mg *Tag) GetDeletionPolicy() xpv1.DeletionPolicy

GetDeletionPolicy of this Tag.

func (*Tag) GetID

func (tr *Tag) GetID() string

GetID returns ID of underlying Terraform resource of this Tag

func (*Tag) GetInitParameters added in v0.5.0

func (tr *Tag) GetInitParameters() (map[string]any, error)

GetInitParameters of this Tag

func (*Tag) GetManagementPolicies added in v0.5.0

func (mg *Tag) GetManagementPolicies() xpv1.ManagementPolicies

GetManagementPolicies of this Tag.

func (*Tag) GetMergedParameters added in v0.8.0

func (tr *Tag) GetMergedParameters(shouldMergeInitProvider bool) (map[string]any, error)

GetInitParameters of this Tag

func (*Tag) GetObservation

func (tr *Tag) GetObservation() (map[string]any, error)

GetObservation of this Tag

func (*Tag) GetParameters

func (tr *Tag) GetParameters() (map[string]any, error)

GetParameters of this Tag

func (*Tag) GetProviderConfigReference

func (mg *Tag) GetProviderConfigReference() *xpv1.Reference

GetProviderConfigReference of this Tag.

func (*Tag) GetPublishConnectionDetailsTo

func (mg *Tag) GetPublishConnectionDetailsTo() *xpv1.PublishConnectionDetailsTo

GetPublishConnectionDetailsTo of this Tag.

func (*Tag) GetTerraformResourceType

func (mg *Tag) GetTerraformResourceType() string

GetTerraformResourceType returns Terraform resource type for this Tag

func (*Tag) GetTerraformSchemaVersion

func (tr *Tag) GetTerraformSchemaVersion() int

GetTerraformSchemaVersion returns the associated Terraform schema version

func (*Tag) GetWriteConnectionSecretToReference

func (mg *Tag) GetWriteConnectionSecretToReference() *xpv1.SecretReference

GetWriteConnectionSecretToReference of this Tag.

func (*Tag) Hub added in v0.8.0

func (tr *Tag) Hub()

Hub marks this type as a conversion hub.

func (*Tag) LateInitialize

func (tr *Tag) LateInitialize(attrs []byte) (bool, error)

LateInitialize this Tag using its observed tfState. returns True if there are any spec changes for the resource.

func (*Tag) SetConditions

func (mg *Tag) SetConditions(c ...xpv1.Condition)

SetConditions of this Tag.

func (*Tag) SetDeletionPolicy

func (mg *Tag) SetDeletionPolicy(r xpv1.DeletionPolicy)

SetDeletionPolicy of this Tag.

func (*Tag) SetManagementPolicies added in v0.5.0

func (mg *Tag) SetManagementPolicies(r xpv1.ManagementPolicies)

SetManagementPolicies of this Tag.

func (*Tag) SetObservation

func (tr *Tag) SetObservation(obs map[string]any) error

SetObservation for this Tag

func (*Tag) SetParameters

func (tr *Tag) SetParameters(params map[string]any) error

SetParameters for this Tag

func (*Tag) SetProviderConfigReference

func (mg *Tag) SetProviderConfigReference(r *xpv1.Reference)

SetProviderConfigReference of this Tag.

func (*Tag) SetPublishConnectionDetailsTo

func (mg *Tag) SetPublishConnectionDetailsTo(r *xpv1.PublishConnectionDetailsTo)

SetPublishConnectionDetailsTo of this Tag.

func (*Tag) SetWriteConnectionSecretToReference

func (mg *Tag) SetWriteConnectionSecretToReference(r *xpv1.SecretReference)

SetWriteConnectionSecretToReference of this Tag.

type TagInitParameters added in v0.5.0

type TagInitParameters struct {

	// The label of the tag.
	Label *string `json:"label,omitempty" tf:"label,omitempty"`
}

func (*TagInitParameters) DeepCopy added in v0.5.0

func (in *TagInitParameters) DeepCopy() *TagInitParameters

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

func (*TagInitParameters) DeepCopyInto added in v0.5.0

func (in *TagInitParameters) DeepCopyInto(out *TagInitParameters)

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

type TagList

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

TagList contains a list of Tags

func (*TagList) DeepCopy

func (in *TagList) DeepCopy() *TagList

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

func (*TagList) DeepCopyInto

func (in *TagList) DeepCopyInto(out *TagList)

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

func (*TagList) DeepCopyObject

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

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

func (*TagList) GetItems

func (l *TagList) GetItems() []resource.Managed

GetItems of this TagList.

type TagObservation

type TagObservation struct {

	// URL at which the entity is uniquely displayed in the Web app.
	HTMLURL *string `json:"htmlUrl,omitempty" tf:"html_url,omitempty"`

	// The ID of the tag.
	ID *string `json:"id,omitempty" tf:"id,omitempty"`

	// The label of the tag.
	Label *string `json:"label,omitempty" tf:"label,omitempty"`

	// A short-form, server-generated string that provides succinct, important information about an object suitable for primary labeling of an entity in a client. In many cases, this will be identical to name, though it is not intended to be an identifier.
	Summary *string `json:"summary,omitempty" tf:"summary,omitempty"`
}

func (*TagObservation) DeepCopy

func (in *TagObservation) DeepCopy() *TagObservation

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

func (*TagObservation) DeepCopyInto

func (in *TagObservation) DeepCopyInto(out *TagObservation)

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

type TagParameters

type TagParameters struct {

	// The label of the tag.
	// +kubebuilder:validation:Optional
	Label *string `json:"label,omitempty" tf:"label,omitempty"`
}

func (*TagParameters) DeepCopy

func (in *TagParameters) DeepCopy() *TagParameters

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

func (*TagParameters) DeepCopyInto

func (in *TagParameters) DeepCopyInto(out *TagParameters)

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

type TagSpec

type TagSpec struct {
	v1.ResourceSpec `json:",inline"`
	ForProvider     TagParameters `json:"forProvider"`
	// THIS IS A BETA FIELD. It will be honored
	// unless the Management Policies feature flag is disabled.
	// InitProvider holds the same fields as ForProvider, with the exception
	// of Identifier and other resource reference fields. The fields that are
	// in InitProvider are merged into ForProvider when the resource is created.
	// The same fields are also added to the terraform ignore_changes hook, to
	// avoid updating them after creation. This is useful for fields that are
	// required on creation, but we do not desire to update them after creation,
	// for example because of an external controller is managing them, like an
	// autoscaler.
	InitProvider TagInitParameters `json:"initProvider,omitempty"`
}

TagSpec defines the desired state of Tag

func (*TagSpec) DeepCopy

func (in *TagSpec) DeepCopy() *TagSpec

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

func (*TagSpec) DeepCopyInto

func (in *TagSpec) DeepCopyInto(out *TagSpec)

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

type TagStatus

type TagStatus struct {
	v1.ResourceStatus `json:",inline"`
	AtProvider        TagObservation `json:"atProvider,omitempty"`
}

TagStatus defines the observed state of Tag.

func (*TagStatus) DeepCopy

func (in *TagStatus) DeepCopy() *TagStatus

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

func (*TagStatus) DeepCopyInto

func (in *TagStatus) DeepCopyInto(out *TagStatus)

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