kawasakifakes

package
v0.0.0-...-7f502db Latest Latest
Warning

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

Go to latest
Published: Mar 2, 2017 License: Apache-2.0 Imports: 7 Imported by: 0

Documentation

Overview

This file was generated by counterfeiter

This file was generated by counterfeiter

This file was generated by counterfeiter

This file was generated by counterfeiter

This file was generated by counterfeiter

This file was generated by counterfeiter

This file was generated by counterfeiter

This file was generated by counterfeiter

This file was generated by counterfeiter

This file was generated by counterfeiter

This file was generated by counterfeiter

This file was generated by counterfeiter

This file was generated by counterfeiter

This file was generated by counterfeiter

This file was generated by counterfeiter

This file was generated by counterfeiter

This file was generated by counterfeiter

This file was generated by counterfeiter

Index

Constants

This section is empty.

Variables

This section is empty.

Functions

This section is empty.

Types

type FakeConfigCreator

type FakeConfigCreator struct {
	CreateStub func(log lager.Logger, handle string, subnet *net.IPNet, ip net.IP) (kawasaki.NetworkConfig, error)
	// contains filtered or unexported fields
}

func (*FakeConfigCreator) Create

func (fake *FakeConfigCreator) Create(log lager.Logger, handle string, subnet *net.IPNet, ip net.IP) (kawasaki.NetworkConfig, error)

func (*FakeConfigCreator) CreateArgsForCall

func (fake *FakeConfigCreator) CreateArgsForCall(i int) (lager.Logger, string, *net.IPNet, net.IP)

func (*FakeConfigCreator) CreateCallCount

func (fake *FakeConfigCreator) CreateCallCount() int

func (*FakeConfigCreator) CreateReturns

func (fake *FakeConfigCreator) CreateReturns(result1 kawasaki.NetworkConfig, result2 error)

func (*FakeConfigCreator) Invocations

func (fake *FakeConfigCreator) Invocations() map[string][][]interface{}

type FakeConfigStore

type FakeConfigStore struct {
	SetStub func(handle string, name string, value string)

	GetStub func(handle string, name string) (string, bool)
	// contains filtered or unexported fields
}

func (*FakeConfigStore) Get

func (fake *FakeConfigStore) Get(handle string, name string) (string, bool)

func (*FakeConfigStore) GetArgsForCall

func (fake *FakeConfigStore) GetArgsForCall(i int) (string, string)

func (*FakeConfigStore) GetCallCount

func (fake *FakeConfigStore) GetCallCount() int

func (*FakeConfigStore) GetReturns

func (fake *FakeConfigStore) GetReturns(result1 string, result2 bool)

func (*FakeConfigStore) Invocations

func (fake *FakeConfigStore) Invocations() map[string][][]interface{}

func (*FakeConfigStore) Set

func (fake *FakeConfigStore) Set(handle string, name string, value string)

func (*FakeConfigStore) SetArgsForCall

func (fake *FakeConfigStore) SetArgsForCall(i int) (string, string, string)

func (*FakeConfigStore) SetCallCount

func (fake *FakeConfigStore) SetCallCount() int

type FakeConfigurer

type FakeConfigurer struct {
	ApplyStub func(log lager.Logger, cfg kawasaki.NetworkConfig, pid int) error

	DestroyBridgeStub func(log lager.Logger, cfg kawasaki.NetworkConfig) error

	DestroyIPTablesRulesStub func(log lager.Logger, cfg kawasaki.NetworkConfig) error
	// contains filtered or unexported fields
}

func (*FakeConfigurer) Apply

func (fake *FakeConfigurer) Apply(log lager.Logger, cfg kawasaki.NetworkConfig, pid int) error

func (*FakeConfigurer) ApplyArgsForCall

func (fake *FakeConfigurer) ApplyArgsForCall(i int) (lager.Logger, kawasaki.NetworkConfig, int)

func (*FakeConfigurer) ApplyCallCount

func (fake *FakeConfigurer) ApplyCallCount() int

func (*FakeConfigurer) ApplyReturns

func (fake *FakeConfigurer) ApplyReturns(result1 error)

func (*FakeConfigurer) DestroyBridge

func (fake *FakeConfigurer) DestroyBridge(log lager.Logger, cfg kawasaki.NetworkConfig) error

func (*FakeConfigurer) DestroyBridgeArgsForCall

func (fake *FakeConfigurer) DestroyBridgeArgsForCall(i int) (lager.Logger, kawasaki.NetworkConfig)

func (*FakeConfigurer) DestroyBridgeCallCount

func (fake *FakeConfigurer) DestroyBridgeCallCount() int

func (*FakeConfigurer) DestroyBridgeReturns

func (fake *FakeConfigurer) DestroyBridgeReturns(result1 error)

func (*FakeConfigurer) DestroyIPTablesRules

func (fake *FakeConfigurer) DestroyIPTablesRules(log lager.Logger, cfg kawasaki.NetworkConfig) error

func (*FakeConfigurer) DestroyIPTablesRulesArgsForCall

func (fake *FakeConfigurer) DestroyIPTablesRulesArgsForCall(i int) (lager.Logger, kawasaki.NetworkConfig)

func (*FakeConfigurer) DestroyIPTablesRulesCallCount

func (fake *FakeConfigurer) DestroyIPTablesRulesCallCount() int

func (*FakeConfigurer) DestroyIPTablesRulesReturns

func (fake *FakeConfigurer) DestroyIPTablesRulesReturns(result1 error)

func (*FakeConfigurer) Invocations

func (fake *FakeConfigurer) Invocations() map[string][][]interface{}

type FakeContainerConfigurer

type FakeContainerConfigurer struct {
	ApplyStub func(logger lager.Logger, cfg kawasaki.NetworkConfig, pid int) error
	// contains filtered or unexported fields
}

func (*FakeContainerConfigurer) Apply

func (fake *FakeContainerConfigurer) Apply(logger lager.Logger, cfg kawasaki.NetworkConfig, pid int) error

func (*FakeContainerConfigurer) ApplyArgsForCall

func (fake *FakeContainerConfigurer) ApplyArgsForCall(i int) (lager.Logger, kawasaki.NetworkConfig, int)

func (*FakeContainerConfigurer) ApplyCallCount

func (fake *FakeContainerConfigurer) ApplyCallCount() int

func (*FakeContainerConfigurer) ApplyReturns

func (fake *FakeContainerConfigurer) ApplyReturns(result1 error)

func (*FakeContainerConfigurer) Invocations

func (fake *FakeContainerConfigurer) Invocations() map[string][][]interface{}

type FakeDnsResolvConfigurer

type FakeDnsResolvConfigurer struct {
	ConfigureStub func(log lager.Logger, cfg kawasaki.NetworkConfig, pid int) error
	// contains filtered or unexported fields
}

func (*FakeDnsResolvConfigurer) Configure

func (fake *FakeDnsResolvConfigurer) Configure(log lager.Logger, cfg kawasaki.NetworkConfig, pid int) error

func (*FakeDnsResolvConfigurer) ConfigureArgsForCall

func (fake *FakeDnsResolvConfigurer) ConfigureArgsForCall(i int) (lager.Logger, kawasaki.NetworkConfig, int)

func (*FakeDnsResolvConfigurer) ConfigureCallCount

func (fake *FakeDnsResolvConfigurer) ConfigureCallCount() int

func (*FakeDnsResolvConfigurer) ConfigureReturns

func (fake *FakeDnsResolvConfigurer) ConfigureReturns(result1 error)

func (*FakeDnsResolvConfigurer) Invocations

func (fake *FakeDnsResolvConfigurer) Invocations() map[string][][]interface{}

type FakeFileWriter

type FakeFileWriter struct {
	WriteFileStub func(log lager.Logger, filePath string, contents []byte, rootfsPath string, rootUid, rootGid int) error
	// contains filtered or unexported fields
}

func (*FakeFileWriter) Invocations

func (fake *FakeFileWriter) Invocations() map[string][][]interface{}

func (*FakeFileWriter) WriteFile

func (fake *FakeFileWriter) WriteFile(log lager.Logger, filePath string, contents []byte, rootfsPath string, rootUid int, rootGid int) error

func (*FakeFileWriter) WriteFileArgsForCall

func (fake *FakeFileWriter) WriteFileArgsForCall(i int) (lager.Logger, string, []byte, string, int, int)

func (*FakeFileWriter) WriteFileCallCount

func (fake *FakeFileWriter) WriteFileCallCount() int

func (*FakeFileWriter) WriteFileReturns

func (fake *FakeFileWriter) WriteFileReturns(result1 error)

type FakeFirewallOpener

type FakeFirewallOpener struct {
	OpenStub func(log lager.Logger, instance, handle string, rule garden.NetOutRule) error

	BulkOpenStub func(log lager.Logger, instance, handle string, rule []garden.NetOutRule) error
	// contains filtered or unexported fields
}

func (*FakeFirewallOpener) BulkOpen

func (fake *FakeFirewallOpener) BulkOpen(log lager.Logger, instance string, handle string, rule []garden.NetOutRule) error

func (*FakeFirewallOpener) BulkOpenArgsForCall

func (fake *FakeFirewallOpener) BulkOpenArgsForCall(i int) (lager.Logger, string, string, []garden.NetOutRule)

func (*FakeFirewallOpener) BulkOpenCallCount

func (fake *FakeFirewallOpener) BulkOpenCallCount() int

func (*FakeFirewallOpener) BulkOpenReturns

func (fake *FakeFirewallOpener) BulkOpenReturns(result1 error)

func (*FakeFirewallOpener) Invocations

func (fake *FakeFirewallOpener) Invocations() map[string][][]interface{}

func (*FakeFirewallOpener) Open

func (fake *FakeFirewallOpener) Open(log lager.Logger, instance string, handle string, rule garden.NetOutRule) error

func (*FakeFirewallOpener) OpenArgsForCall

func (fake *FakeFirewallOpener) OpenArgsForCall(i int) (lager.Logger, string, string, garden.NetOutRule)

func (*FakeFirewallOpener) OpenCallCount

func (fake *FakeFirewallOpener) OpenCallCount() int

func (*FakeFirewallOpener) OpenReturns

func (fake *FakeFirewallOpener) OpenReturns(result1 error)

type FakeHostConfigurer

type FakeHostConfigurer struct {
	ApplyStub func(logger lager.Logger, cfg kawasaki.NetworkConfig, pid int) error

	DestroyStub func(cfg kawasaki.NetworkConfig) error
	// contains filtered or unexported fields
}

func (*FakeHostConfigurer) Apply

func (fake *FakeHostConfigurer) Apply(logger lager.Logger, cfg kawasaki.NetworkConfig, pid int) error

func (*FakeHostConfigurer) ApplyArgsForCall

func (fake *FakeHostConfigurer) ApplyArgsForCall(i int) (lager.Logger, kawasaki.NetworkConfig, int)

func (*FakeHostConfigurer) ApplyCallCount

func (fake *FakeHostConfigurer) ApplyCallCount() int

func (*FakeHostConfigurer) ApplyReturns

func (fake *FakeHostConfigurer) ApplyReturns(result1 error)

func (*FakeHostConfigurer) Destroy

func (fake *FakeHostConfigurer) Destroy(cfg kawasaki.NetworkConfig) error

func (*FakeHostConfigurer) DestroyArgsForCall

func (fake *FakeHostConfigurer) DestroyArgsForCall(i int) kawasaki.NetworkConfig

func (*FakeHostConfigurer) DestroyCallCount

func (fake *FakeHostConfigurer) DestroyCallCount() int

func (*FakeHostConfigurer) DestroyReturns

func (fake *FakeHostConfigurer) DestroyReturns(result1 error)

func (*FakeHostConfigurer) Invocations

func (fake *FakeHostConfigurer) Invocations() map[string][][]interface{}

type FakeHostFileCompiler

type FakeHostFileCompiler struct {
	CompileStub func(log lager.Logger, containerIp net.IP, handle string) ([]byte, error)
	// contains filtered or unexported fields
}

func (*FakeHostFileCompiler) Compile

func (fake *FakeHostFileCompiler) Compile(log lager.Logger, containerIp net.IP, handle string) ([]byte, error)

func (*FakeHostFileCompiler) CompileArgsForCall

func (fake *FakeHostFileCompiler) CompileArgsForCall(i int) (lager.Logger, net.IP, string)

func (*FakeHostFileCompiler) CompileCallCount

func (fake *FakeHostFileCompiler) CompileCallCount() int

func (*FakeHostFileCompiler) CompileReturns

func (fake *FakeHostFileCompiler) CompileReturns(result1 []byte, result2 error)

func (*FakeHostFileCompiler) Invocations

func (fake *FakeHostFileCompiler) Invocations() map[string][][]interface{}

type FakeIDGenerator

type FakeIDGenerator struct {
	GenerateStub func() string
	// contains filtered or unexported fields
}

func (*FakeIDGenerator) Generate

func (fake *FakeIDGenerator) Generate() string

func (*FakeIDGenerator) GenerateCallCount

func (fake *FakeIDGenerator) GenerateCallCount() int

func (*FakeIDGenerator) GenerateReturns

func (fake *FakeIDGenerator) GenerateReturns(result1 string)

func (*FakeIDGenerator) Invocations

func (fake *FakeIDGenerator) Invocations() map[string][][]interface{}

type FakeIdMapReader

type FakeIdMapReader struct {
	ReadRootIdStub func(path string) (int, error)
	// contains filtered or unexported fields
}

func (*FakeIdMapReader) Invocations

func (fake *FakeIdMapReader) Invocations() map[string][][]interface{}

func (*FakeIdMapReader) ReadRootId

func (fake *FakeIdMapReader) ReadRootId(path string) (int, error)

func (*FakeIdMapReader) ReadRootIdArgsForCall

func (fake *FakeIdMapReader) ReadRootIdArgsForCall(i int) string

func (*FakeIdMapReader) ReadRootIdCallCount

func (fake *FakeIdMapReader) ReadRootIdCallCount() int

func (*FakeIdMapReader) ReadRootIdReturns

func (fake *FakeIdMapReader) ReadRootIdReturns(result1 int, result2 error)

type FakeInstanceChainCreator

type FakeInstanceChainCreator struct {
	CreateStub func(logger lager.Logger, handle, instanceChain, bridgeName string, ip net.IP, network *net.IPNet) error

	DestroyStub func(logger lager.Logger, instanceChain string) error
	// contains filtered or unexported fields
}

func (*FakeInstanceChainCreator) Create

func (fake *FakeInstanceChainCreator) Create(logger lager.Logger, handle string, instanceChain string, bridgeName string, ip net.IP, network *net.IPNet) error

func (*FakeInstanceChainCreator) CreateArgsForCall

func (fake *FakeInstanceChainCreator) CreateArgsForCall(i int) (lager.Logger, string, string, string, net.IP, *net.IPNet)

func (*FakeInstanceChainCreator) CreateCallCount

func (fake *FakeInstanceChainCreator) CreateCallCount() int

func (*FakeInstanceChainCreator) CreateReturns

func (fake *FakeInstanceChainCreator) CreateReturns(result1 error)

func (*FakeInstanceChainCreator) Destroy

func (fake *FakeInstanceChainCreator) Destroy(logger lager.Logger, instanceChain string) error

func (*FakeInstanceChainCreator) DestroyArgsForCall

func (fake *FakeInstanceChainCreator) DestroyArgsForCall(i int) (lager.Logger, string)

func (*FakeInstanceChainCreator) DestroyCallCount

func (fake *FakeInstanceChainCreator) DestroyCallCount() int

func (*FakeInstanceChainCreator) DestroyReturns

func (fake *FakeInstanceChainCreator) DestroyReturns(result1 error)

func (*FakeInstanceChainCreator) Invocations

func (fake *FakeInstanceChainCreator) Invocations() map[string][][]interface{}

type FakeNetnsExecer

type FakeNetnsExecer struct {
	ExecStub func(netnsFD *os.File, cb func() error) error
	// contains filtered or unexported fields
}

func (*FakeNetnsExecer) Exec

func (fake *FakeNetnsExecer) Exec(netnsFD *os.File, cb func() error) error

func (*FakeNetnsExecer) ExecArgsForCall

func (fake *FakeNetnsExecer) ExecArgsForCall(i int) (*os.File, func() error)

func (*FakeNetnsExecer) ExecCallCount

func (fake *FakeNetnsExecer) ExecCallCount() int

func (*FakeNetnsExecer) ExecReturns

func (fake *FakeNetnsExecer) ExecReturns(result1 error)

func (*FakeNetnsExecer) Invocations

func (fake *FakeNetnsExecer) Invocations() map[string][][]interface{}

type FakeNetworker

type FakeNetworker struct {
	CapacityStub func() uint64

	NetworkStub func(log lager.Logger, spec garden.ContainerSpec, pid int) error

	DestroyStub func(log lager.Logger, handle string) error

	NetInStub func(log lager.Logger, handle string, externalPort, containerPort uint32) (uint32, uint32, error)

	NetOutStub func(log lager.Logger, handle string, rule garden.NetOutRule) error

	BulkNetOutStub func(log lager.Logger, handle string, rules []garden.NetOutRule) error

	RestoreStub func(log lager.Logger, handle string) error
	// contains filtered or unexported fields
}

func (*FakeNetworker) BulkNetOut

func (fake *FakeNetworker) BulkNetOut(log lager.Logger, handle string, rules []garden.NetOutRule) error

func (*FakeNetworker) BulkNetOutArgsForCall

func (fake *FakeNetworker) BulkNetOutArgsForCall(i int) (lager.Logger, string, []garden.NetOutRule)

func (*FakeNetworker) BulkNetOutCallCount

func (fake *FakeNetworker) BulkNetOutCallCount() int

func (*FakeNetworker) BulkNetOutReturns

func (fake *FakeNetworker) BulkNetOutReturns(result1 error)

func (*FakeNetworker) Capacity

func (fake *FakeNetworker) Capacity() uint64

func (*FakeNetworker) CapacityCallCount

func (fake *FakeNetworker) CapacityCallCount() int

func (*FakeNetworker) CapacityReturns

func (fake *FakeNetworker) CapacityReturns(result1 uint64)

func (*FakeNetworker) Destroy

func (fake *FakeNetworker) Destroy(log lager.Logger, handle string) error

func (*FakeNetworker) DestroyArgsForCall

func (fake *FakeNetworker) DestroyArgsForCall(i int) (lager.Logger, string)

func (*FakeNetworker) DestroyCallCount

func (fake *FakeNetworker) DestroyCallCount() int

func (*FakeNetworker) DestroyReturns

func (fake *FakeNetworker) DestroyReturns(result1 error)

func (*FakeNetworker) Invocations

func (fake *FakeNetworker) Invocations() map[string][][]interface{}

func (*FakeNetworker) NetIn

func (fake *FakeNetworker) NetIn(log lager.Logger, handle string, externalPort uint32, containerPort uint32) (uint32, uint32, error)

func (*FakeNetworker) NetInArgsForCall

func (fake *FakeNetworker) NetInArgsForCall(i int) (lager.Logger, string, uint32, uint32)

func (*FakeNetworker) NetInCallCount

func (fake *FakeNetworker) NetInCallCount() int

func (*FakeNetworker) NetInReturns

func (fake *FakeNetworker) NetInReturns(result1 uint32, result2 uint32, result3 error)

func (*FakeNetworker) NetOut

func (fake *FakeNetworker) NetOut(log lager.Logger, handle string, rule garden.NetOutRule) error

func (*FakeNetworker) NetOutArgsForCall

func (fake *FakeNetworker) NetOutArgsForCall(i int) (lager.Logger, string, garden.NetOutRule)

func (*FakeNetworker) NetOutCallCount

func (fake *FakeNetworker) NetOutCallCount() int

func (*FakeNetworker) NetOutReturns

func (fake *FakeNetworker) NetOutReturns(result1 error)

func (*FakeNetworker) Network

func (fake *FakeNetworker) Network(log lager.Logger, spec garden.ContainerSpec, pid int) error

func (*FakeNetworker) NetworkArgsForCall

func (fake *FakeNetworker) NetworkArgsForCall(i int) (lager.Logger, garden.ContainerSpec, int)

func (*FakeNetworker) NetworkCallCount

func (fake *FakeNetworker) NetworkCallCount() int

func (*FakeNetworker) NetworkReturns

func (fake *FakeNetworker) NetworkReturns(result1 error)

func (*FakeNetworker) Restore

func (fake *FakeNetworker) Restore(log lager.Logger, handle string) error

func (*FakeNetworker) RestoreArgsForCall

func (fake *FakeNetworker) RestoreArgsForCall(i int) (lager.Logger, string)

func (*FakeNetworker) RestoreCallCount

func (fake *FakeNetworker) RestoreCallCount() int

func (*FakeNetworker) RestoreReturns

func (fake *FakeNetworker) RestoreReturns(result1 error)

type FakePortForwarder

type FakePortForwarder struct {
	ForwardStub func(spec kawasaki.PortForwarderSpec) error
	// contains filtered or unexported fields
}

func (*FakePortForwarder) Forward

func (fake *FakePortForwarder) Forward(spec kawasaki.PortForwarderSpec) error

func (*FakePortForwarder) ForwardArgsForCall

func (fake *FakePortForwarder) ForwardArgsForCall(i int) kawasaki.PortForwarderSpec

func (*FakePortForwarder) ForwardCallCount

func (fake *FakePortForwarder) ForwardCallCount() int

func (*FakePortForwarder) ForwardReturns

func (fake *FakePortForwarder) ForwardReturns(result1 error)

func (*FakePortForwarder) Invocations

func (fake *FakePortForwarder) Invocations() map[string][][]interface{}

type FakePortPool

type FakePortPool struct {
	AcquireStub func() (uint32, error)

	ReleaseStub func(uint32)

	RemoveStub func(uint32) error
	// contains filtered or unexported fields
}

func (*FakePortPool) Acquire

func (fake *FakePortPool) Acquire() (uint32, error)

func (*FakePortPool) AcquireCallCount

func (fake *FakePortPool) AcquireCallCount() int

func (*FakePortPool) AcquireReturns

func (fake *FakePortPool) AcquireReturns(result1 uint32, result2 error)

func (*FakePortPool) Invocations

func (fake *FakePortPool) Invocations() map[string][][]interface{}

func (*FakePortPool) Release

func (fake *FakePortPool) Release(arg1 uint32)

func (*FakePortPool) ReleaseArgsForCall

func (fake *FakePortPool) ReleaseArgsForCall(i int) uint32

func (*FakePortPool) ReleaseCallCount

func (fake *FakePortPool) ReleaseCallCount() int

func (*FakePortPool) Remove

func (fake *FakePortPool) Remove(arg1 uint32) error

func (*FakePortPool) RemoveArgsForCall

func (fake *FakePortPool) RemoveArgsForCall(i int) uint32

func (*FakePortPool) RemoveCallCount

func (fake *FakePortPool) RemoveCallCount() int

func (*FakePortPool) RemoveReturns

func (fake *FakePortPool) RemoveReturns(result1 error)

type FakeResolvFileCompiler

type FakeResolvFileCompiler struct {
	CompileStub func(log lager.Logger, resolvConfPath string, containerIp net.IP, overrideServers []net.IP) ([]byte, error)
	// contains filtered or unexported fields
}

func (*FakeResolvFileCompiler) Compile

func (fake *FakeResolvFileCompiler) Compile(log lager.Logger, resolvConfPath string, containerIp net.IP, overrideServers []net.IP) ([]byte, error)

func (*FakeResolvFileCompiler) CompileArgsForCall

func (fake *FakeResolvFileCompiler) CompileArgsForCall(i int) (lager.Logger, string, net.IP, []net.IP)

func (*FakeResolvFileCompiler) CompileCallCount

func (fake *FakeResolvFileCompiler) CompileCallCount() int

func (*FakeResolvFileCompiler) CompileReturns

func (fake *FakeResolvFileCompiler) CompileReturns(result1 []byte, result2 error)

func (*FakeResolvFileCompiler) Invocations

func (fake *FakeResolvFileCompiler) Invocations() map[string][][]interface{}

type FakeSpecParser

type FakeSpecParser struct {
	ParseStub func(log lager.Logger, spec string) (subnets.SubnetSelector, subnets.IPSelector, error)
	// contains filtered or unexported fields
}

func (*FakeSpecParser) Invocations

func (fake *FakeSpecParser) Invocations() map[string][][]interface{}

func (*FakeSpecParser) Parse

func (*FakeSpecParser) ParseArgsForCall

func (fake *FakeSpecParser) ParseArgsForCall(i int) (lager.Logger, string)

func (*FakeSpecParser) ParseCallCount

func (fake *FakeSpecParser) ParseCallCount() int

func (*FakeSpecParser) ParseReturns

func (fake *FakeSpecParser) ParseReturns(result1 subnets.SubnetSelector, result2 subnets.IPSelector, result3 error)

Jump to

Keyboard shortcuts

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