azure

package
v1.1.0 Latest Latest
Warning

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

Go to latest
Published: Aug 25, 2023 License: Apache-2.0 Imports: 21 Imported by: 0

Documentation

Index

Constants

View Source
const (
	FILE_PERM_CLUSTER_DIR        = os.FileMode(0750)
	FILE_PERM_CLUSTER_STATE      = os.FileMode(0640)
	FILE_PERM_CLUSTER_KUBECONFIG = os.FileMode(0755)
	STATE_FILE_NAME              = string("cloud-state.json")
	KUBECONFIG_FILE_NAME         = string("kubeconfig")
)

Variables

This section is empty.

Functions

func GetInputCredential

func GetInputCredential(storage resources.StorageFactory) error

Types

type AzureGo

type AzureGo interface {
	InitClient(storage resources.StorageFactory) error

	SetRegion(string)

	SetResourceGrp(string)

	ListLocations() ([]string, error)

	ListKubernetesVersions() (armcontainerservicev4.ManagedClustersClientListKubernetesVersionsResponse, error)

	ListVMTypes() ([]string, error)

	CreateResourceGrp(parameters armresources.ResourceGroup,
		options *armresources.ResourceGroupsClientCreateOrUpdateOptions) (armresources.ResourceGroupsClientCreateOrUpdateResponse, error)

	BeginDeleteResourceGrp(
		options *armresources.ResourceGroupsClientBeginDeleteOptions) (*runtime.Poller[armresources.ResourceGroupsClientDeleteResponse], error)

	BeginCreateVirtNet(virtualNetworkName string, parameters armnetwork.VirtualNetwork,
		options *armnetwork.VirtualNetworksClientBeginCreateOrUpdateOptions) (*runtime.Poller[armnetwork.VirtualNetworksClientCreateOrUpdateResponse], error)

	BeginDeleteVirtNet(virtualNetworkName string,
		options *armnetwork.VirtualNetworksClientBeginDeleteOptions) (*runtime.Poller[armnetwork.VirtualNetworksClientDeleteResponse], error)

	BeginCreateSubNet(virtualNetworkName string, subnetName string, subnetParameters armnetwork.Subnet,
		options *armnetwork.SubnetsClientBeginCreateOrUpdateOptions) (*runtime.Poller[armnetwork.SubnetsClientCreateOrUpdateResponse], error)

	BeginDeleteSubNet(virtualNetworkName string, subnetName string,
		options *armnetwork.SubnetsClientBeginDeleteOptions) (*runtime.Poller[armnetwork.SubnetsClientDeleteResponse], error)

	BeginDeleteSecurityGrp(networkSecurityGroupName string,
		options *armnetwork.SecurityGroupsClientBeginDeleteOptions) (*runtime.Poller[armnetwork.SecurityGroupsClientDeleteResponse], error)

	BeginCreateSecurityGrp(networkSecurityGroupName string, parameters armnetwork.SecurityGroup,
		options *armnetwork.SecurityGroupsClientBeginCreateOrUpdateOptions) (*runtime.Poller[armnetwork.SecurityGroupsClientCreateOrUpdateResponse], error)

	CreateSSHKey(sshPublicKeyName string, parameters armcompute.SSHPublicKeyResource,
		options *armcompute.SSHPublicKeysClientCreateOptions) (armcompute.SSHPublicKeysClientCreateResponse, error)

	DeleteSSHKey(sshPublicKeyName string,
		options *armcompute.SSHPublicKeysClientDeleteOptions) (armcompute.SSHPublicKeysClientDeleteResponse, error)

	BeginCreateVM(vmName string, parameters armcompute.VirtualMachine,
		options *armcompute.VirtualMachinesClientBeginCreateOrUpdateOptions) (*runtime.Poller[armcompute.VirtualMachinesClientCreateOrUpdateResponse], error)

	BeginDeleteVM(vmName string,
		options *armcompute.VirtualMachinesClientBeginDeleteOptions) (*runtime.Poller[armcompute.VirtualMachinesClientDeleteResponse], error)

	BeginDeleteDisk(diskName string,
		options *armcompute.DisksClientBeginDeleteOptions) (*runtime.Poller[armcompute.DisksClientDeleteResponse], error)

	BeginCreatePubIP(publicIPAddressName string, parameters armnetwork.PublicIPAddress,
		options *armnetwork.PublicIPAddressesClientBeginCreateOrUpdateOptions) (*runtime.Poller[armnetwork.PublicIPAddressesClientCreateOrUpdateResponse], error)

	BeginDeletePubIP(publicIPAddressName string,
		options *armnetwork.PublicIPAddressesClientBeginDeleteOptions) (*runtime.Poller[armnetwork.PublicIPAddressesClientDeleteResponse], error)

	BeginCreateNIC(networkInterfaceName string, parameters armnetwork.Interface,
		options *armnetwork.InterfacesClientBeginCreateOrUpdateOptions) (*runtime.Poller[armnetwork.InterfacesClientCreateOrUpdateResponse], error)

	BeginDeleteNIC(networkInterfaceName string,
		options *armnetwork.InterfacesClientBeginDeleteOptions) (*runtime.Poller[armnetwork.InterfacesClientDeleteResponse], error)

	BeginDeleteAKS(resourceName string,
		options *armcontainerservice.ManagedClustersClientBeginDeleteOptions) (*runtime.Poller[armcontainerservice.ManagedClustersClientDeleteResponse], error)

	BeginCreateAKS(resourceName string, parameters armcontainerservice.ManagedCluster,
		options *armcontainerservice.ManagedClustersClientBeginCreateOrUpdateOptions) (*runtime.Poller[armcontainerservice.ManagedClustersClientCreateOrUpdateResponse], error)

	ListClusterAdminCredentials(resourceName string,
		options *armcontainerservice.ManagedClustersClientListClusterAdminCredentialsOptions) (armcontainerservice.ManagedClustersClientListClusterAdminCredentialsResponse, error)

	PollUntilDoneDelNSG(ctx context.Context, poll *runtime.Poller[armnetwork.SecurityGroupsClientDeleteResponse], options *runtime.PollUntilDoneOptions) (armnetwork.SecurityGroupsClientDeleteResponse, error)

	PollUntilDoneCreateNSG(ctx context.Context, poll *runtime.Poller[armnetwork.SecurityGroupsClientCreateOrUpdateResponse], options *runtime.PollUntilDoneOptions) (armnetwork.SecurityGroupsClientCreateOrUpdateResponse, error)

	PollUntilDoneDelResourceGrp(ctx context.Context, poll *runtime.Poller[armresources.ResourceGroupsClientDeleteResponse], options *runtime.PollUntilDoneOptions) (armresources.ResourceGroupsClientDeleteResponse, error)

	PollUntilDoneCreateSubNet(ctx context.Context, poll *runtime.Poller[armnetwork.SubnetsClientCreateOrUpdateResponse], options *runtime.PollUntilDoneOptions) (armnetwork.SubnetsClientCreateOrUpdateResponse, error)

	PollUntilDoneDelSubNet(ctx context.Context, poll *runtime.Poller[armnetwork.SubnetsClientDeleteResponse], options *runtime.PollUntilDoneOptions) (armnetwork.SubnetsClientDeleteResponse, error)

	PollUntilDoneCreateVirtNet(ctx context.Context, poll *runtime.Poller[armnetwork.VirtualNetworksClientCreateOrUpdateResponse], options *runtime.PollUntilDoneOptions) (armnetwork.VirtualNetworksClientCreateOrUpdateResponse, error)

	PollUntilDoneDelVirtNet(ctx context.Context, poll *runtime.Poller[armnetwork.VirtualNetworksClientDeleteResponse], options *runtime.PollUntilDoneOptions) (armnetwork.VirtualNetworksClientDeleteResponse, error)

	PollUntilDoneCreateAKS(ctx context.Context, poll *runtime.Poller[armcontainerservice.ManagedClustersClientCreateOrUpdateResponse], options *runtime.PollUntilDoneOptions) (armcontainerservice.ManagedClustersClientCreateOrUpdateResponse, error)

	PollUntilDoneDelAKS(ctx context.Context, poll *runtime.Poller[armcontainerservice.ManagedClustersClientDeleteResponse], options *runtime.PollUntilDoneOptions) (armcontainerservice.ManagedClustersClientDeleteResponse, error)

	PollUntilDoneDelVM(ctx context.Context, poll *runtime.Poller[armcompute.VirtualMachinesClientDeleteResponse], options *runtime.PollUntilDoneOptions) (armcompute.VirtualMachinesClientDeleteResponse, error)

	PollUntilDoneCreateVM(ctx context.Context, poll *runtime.Poller[armcompute.VirtualMachinesClientCreateOrUpdateResponse], options *runtime.PollUntilDoneOptions) (armcompute.VirtualMachinesClientCreateOrUpdateResponse, error)

	PollUntilDoneDelDisk(ctx context.Context, poll *runtime.Poller[armcompute.DisksClientDeleteResponse], options *runtime.PollUntilDoneOptions) (armcompute.DisksClientDeleteResponse, error)

	PollUntilDoneCreatePubIP(ctx context.Context, poll *runtime.Poller[armnetwork.PublicIPAddressesClientCreateOrUpdateResponse], options *runtime.PollUntilDoneOptions) (armnetwork.PublicIPAddressesClientCreateOrUpdateResponse, error)

	PollUntilDoneDelPubIP(ctx context.Context, poll *runtime.Poller[armnetwork.PublicIPAddressesClientDeleteResponse], options *runtime.PollUntilDoneOptions) (armnetwork.PublicIPAddressesClientDeleteResponse, error)

	PollUntilDoneCreateNetInterface(ctx context.Context, poll *runtime.Poller[armnetwork.InterfacesClientCreateOrUpdateResponse], options *runtime.PollUntilDoneOptions) (armnetwork.InterfacesClientCreateOrUpdateResponse, error)

	PollUntilDoneDelNetInterface(ctx context.Context, poll *runtime.Poller[armnetwork.InterfacesClientDeleteResponse], options *runtime.PollUntilDoneOptions) (armnetwork.InterfacesClientDeleteResponse, error)
}

func ProvideClient

func ProvideClient() AzureGo

func ProvideMockClient

func ProvideMockClient() AzureGo

type AzureGoClient

type AzureGoClient struct {
	SubscriptionID string
	AzureTokenCred azcore.TokenCredential
	Region         string
	ResourceGrp    string
}

func (*AzureGoClient) BeginCreateNIC

func (*AzureGoClient) BeginCreateSecurityGrp

func (*AzureGoClient) BeginCreateSubNet

func (azclient *AzureGoClient) BeginCreateSubNet(virtualNetworkName string, subnetName string, subnetParameters armnetwork.Subnet, options *armnetwork.SubnetsClientBeginCreateOrUpdateOptions) (*runtime.Poller[armnetwork.SubnetsClientCreateOrUpdateResponse], error)

func (*AzureGoClient) BeginDeleteDisk

func (*AzureGoClient) BeginDeleteNIC

func (*AzureGoClient) BeginDeletePubIP

func (*AzureGoClient) BeginDeleteSecurityGrp

func (azclient *AzureGoClient) BeginDeleteSecurityGrp(networkSecurityGroupName string, options *armnetwork.SecurityGroupsClientBeginDeleteOptions) (*runtime.Poller[armnetwork.SecurityGroupsClientDeleteResponse], error)

func (*AzureGoClient) BeginDeleteSubNet

func (azclient *AzureGoClient) BeginDeleteSubNet(virtualNetworkName string, subnetName string, options *armnetwork.SubnetsClientBeginDeleteOptions) (*runtime.Poller[armnetwork.SubnetsClientDeleteResponse], error)

func (*AzureGoClient) BeginDeleteVirtNet

func (*AzureGoClient) CreateSSHKey

func (*AzureGoClient) DeleteSSHKey

func (*AzureGoClient) InitClient

func (azclient *AzureGoClient) InitClient(storage resources.StorageFactory) error

func (*AzureGoClient) ListLocations

func (azclient *AzureGoClient) ListLocations() ([]string, error)

func (*AzureGoClient) ListVMTypes

func (azclient *AzureGoClient) ListVMTypes() ([]string, error)

func (*AzureGoClient) PollUntilDoneCreateNetInterface

PollUntilDoneCreateNetInterface implements AzureGo.

func (*AzureGoClient) PollUntilDoneCreatePubIP

PollUntilDoneCreatePubIP implements AzureGo.

func (*AzureGoClient) PollUntilDoneCreateVM

PollUntilDoneCreateVM implements AzureGo.

func (*AzureGoClient) PollUntilDoneDelDisk

PollUntilDoneDelDisk implements AzureGo.

func (*AzureGoClient) PollUntilDoneDelNetInterface

PollUntilDoneDelNetInterface implements AzureGo.

func (*AzureGoClient) PollUntilDoneDelPubIP

PollUntilDoneDelPubIP implements AzureGo.

func (*AzureGoClient) PollUntilDoneDelVM

PollUntilDoneDelVM implements AzureGo.

func (*AzureGoClient) PublicIPClient

func (azclient *AzureGoClient) PublicIPClient() (*armnetwork.PublicIPAddressesClient, error)

func (*AzureGoClient) SetRegion

func (azclient *AzureGoClient) SetRegion(reg string)

func (*AzureGoClient) SetResourceGrp

func (azclient *AzureGoClient) SetResourceGrp(grp string)

type AzureGoMockClient

type AzureGoMockClient struct {
	SubscriptionID string
	AzureTokenCred azcore.TokenCredential
	Region         string
	ResourceGrp    string
}

func (*AzureGoMockClient) BeginCreateSubNet

func (mock *AzureGoMockClient) BeginCreateSubNet(virtualNetworkName string, subnetName string, subnetParameters armnetwork.Subnet, options *armnetwork.SubnetsClientBeginCreateOrUpdateOptions) (*runtime.Poller[armnetwork.SubnetsClientCreateOrUpdateResponse], error)

func (*AzureGoMockClient) BeginDeleteDisk

func (*AzureGoMockClient) BeginDeleteNIC

func (*AzureGoMockClient) BeginDeleteSecurityGrp

func (*AzureGoMockClient) BeginDeleteSubNet

func (mock *AzureGoMockClient) BeginDeleteSubNet(virtualNetworkName string, subnetName string, options *armnetwork.SubnetsClientBeginDeleteOptions) (*runtime.Poller[armnetwork.SubnetsClientDeleteResponse], error)

func (*AzureGoMockClient) BeginDeleteVirtNet

func (*AzureGoMockClient) CreateSSHKey

func (*AzureGoMockClient) DeleteSSHKey

func (*AzureGoMockClient) InitClient

func (mock *AzureGoMockClient) InitClient(storage resources.StorageFactory) error

func (*AzureGoMockClient) ListLocations

func (mock *AzureGoMockClient) ListLocations() ([]string, error)

ListLocations: TODO: unable to mock the Pager so moved on with more work for ListLocation method instead of it returning (*runtime.Pager[armsubscriptions.ClientListLocationsResponse], error) it will return the ([]string, error)

func (*AzureGoMockClient) ListVMTypes

func (mock *AzureGoMockClient) ListVMTypes() ([]string, error)

func (*AzureGoMockClient) SetRegion

func (mock *AzureGoMockClient) SetRegion(s string)

func (*AzureGoMockClient) SetResourceGrp

func (mock *AzureGoMockClient) SetResourceGrp(s string)

type AzureProvider

type AzureProvider struct {
	ClusterName   string `json:"cluster_name"`
	HACluster     bool   `json:"ha_cluster"`
	ResourceGroup string `json:"resource_group"`
	Region        string `json:"region"`

	SSHPath  string `json:"ssh_key"`
	Metadata Metadata

	Client AzureGo
}

func ReturnAzureStruct

func ReturnAzureStruct(metadata resources.Metadata, ClientOption func() AzureGo) (*AzureProvider, error)

func (*AzureProvider) Application

func (cloud *AzureProvider) Application(s string) resources.CloudFactory

func (*AzureProvider) CNI

func (*AzureProvider) CreateNetworkInterface

func (obj *AzureProvider) CreateNetworkInterface(ctx context.Context, storage resources.StorageFactory,
	nicName string, subnetID string, publicIPID string, networkSecurityGroupID string, index int) error

func (*AzureProvider) CreatePublicIP

func (obj *AzureProvider) CreatePublicIP(ctx context.Context, storage resources.StorageFactory, publicIPName string, index int) error

func (*AzureProvider) CreateSubnet

func (obj *AzureProvider) CreateSubnet(ctx context.Context, storage resources.StorageFactory, subnetName string) error

func (*AzureProvider) CreateUploadSSHKeyPair

func (obj *AzureProvider) CreateUploadSSHKeyPair(storage resources.StorageFactory) error

CreateUploadSSHKeyPair implements resources.CloudFactory.

func (*AzureProvider) CreateVirtualNetwork

func (obj *AzureProvider) CreateVirtualNetwork(ctx context.Context, storage resources.StorageFactory, resName string) error

func (*AzureProvider) DelFirewall

func (obj *AzureProvider) DelFirewall(storage resources.StorageFactory) error

DelFirewall implements resources.CloudFactory.

func (*AzureProvider) DelManagedCluster

func (obj *AzureProvider) DelManagedCluster(storage resources.StorageFactory) error

DelManagedCluster implements resources.CloudFactory.

func (*AzureProvider) DelNetwork

func (obj *AzureProvider) DelNetwork(storage resources.StorageFactory) error

DelNetwork implements resources.CloudFactory.

func (*AzureProvider) DelSSHKeyPair

func (obj *AzureProvider) DelSSHKeyPair(storage resources.StorageFactory) error

DelSSHKeyPair implements resources.CloudFactory.

func (*AzureProvider) DelVM

func (obj *AzureProvider) DelVM(storage resources.StorageFactory, indexNo int) error

DelVM implements resources.CloudFactory.

func (*AzureProvider) DeleteDisk

func (obj *AzureProvider) DeleteDisk(ctx context.Context, storage resources.StorageFactory, index int) error

func (*AzureProvider) DeleteNetworkInterface

func (obj *AzureProvider) DeleteNetworkInterface(ctx context.Context, storage resources.StorageFactory, index int) error

func (*AzureProvider) DeletePublicIP

func (obj *AzureProvider) DeletePublicIP(ctx context.Context, storage resources.StorageFactory, index int) error

func (*AzureProvider) DeleteSubnet

func (obj *AzureProvider) DeleteSubnet(ctx context.Context, storage resources.StorageFactory) error

func (*AzureProvider) DeleteVirtualNetwork

func (obj *AzureProvider) DeleteVirtualNetwork(ctx context.Context, storage resources.StorageFactory) error

func (*AzureProvider) GetHostNameAllWorkerNode

func (*AzureProvider) GetHostNameAllWorkerNode() []string

func (*AzureProvider) GetManagedKubernetes

func (*AzureProvider) GetManagedKubernetes(resources.StorageFactory)

GetManagedKubernetes implements resources.CloudFactory.

func (*AzureProvider) GetStateForHACluster

GetStateForHACluster implements resources.CloudFactory. WARN: the array copy is a shallow copy

func (*AzureProvider) InitState

func (obj *AzureProvider) InitState(storage resources.StorageFactory, operation string) error

InitState implements resources.CloudFactory.

func (*AzureProvider) Name

func (cloud *AzureProvider) Name(resName string) resources.CloudFactory

Name it will contain the name of the resource to be created

func (*AzureProvider) NewFirewall

func (obj *AzureProvider) NewFirewall(storage resources.StorageFactory) error

NewFirewall implements resources.CloudFactory.

func (*AzureProvider) NewManagedCluster

func (obj *AzureProvider) NewManagedCluster(storage resources.StorageFactory, noOfNodes int) error

NewManagedCluster implements resources.CloudFactory.

func (*AzureProvider) NewNetwork

func (obj *AzureProvider) NewNetwork(storage resources.StorageFactory) error

NewNetwork implements resources.CloudFactory.

func (*AzureProvider) NewVM

func (obj *AzureProvider) NewVM(storage resources.StorageFactory, indexNo int) error

NewVM implements resources.CloudFactory.

func (*AzureProvider) NoOfControlPlane

func (obj *AzureProvider) NoOfControlPlane(no int, setter bool) (int, error)

NoOfControlPlane implements resources.CloudFactory.

func (*AzureProvider) NoOfDataStore

func (obj *AzureProvider) NoOfDataStore(no int, setter bool) (int, error)

NoOfDataStore implements resources.CloudFactory.

func (*AzureProvider) NoOfWorkerPlane

func (obj *AzureProvider) NoOfWorkerPlane(storage resources.StorageFactory, no int, setter bool) (int, error)

NoOfWorkerPlane implements resources.CloudFactory.

func (*AzureProvider) Role

func (cloud *AzureProvider) Role(resRole string) resources.CloudFactory

Role it will contain whether the resource to be created belongs for controlplane component or loadbalancer...

func (*AzureProvider) SupportForApplications

func (cloud *AzureProvider) SupportForApplications() bool

SupportForApplications if its ha its always false instead it tells whether the provider has support in their managed offerering

func (*AzureProvider) SupportForCNI

func (cloud *AzureProvider) SupportForCNI() bool

func (*AzureProvider) SwitchCluster

func (obj *AzureProvider) SwitchCluster(storage resources.StorageFactory) error

func (*AzureProvider) VMType

func (cloud *AzureProvider) VMType(size string) resources.CloudFactory

VMType it will contain which vmType to create

func (*AzureProvider) Version

func (obj *AzureProvider) Version(ver string) resources.CloudFactory

Version implements resources.CloudFactory.

func (*AzureProvider) Visibility

func (cloud *AzureProvider) Visibility(toBePublic bool) resources.CloudFactory

Visibility whether to have the resource as public or private (i.e. VMs)

type AzureStateVM

type AzureStateVM struct {
	Name                     string `json:"name"`
	NetworkSecurityGroupName string `json:"network_security_group_name"`
	NetworkSecurityGroupID   string `json:"network_security_group_id"`
	DiskName                 string `json:"disk_name"`
	PublicIPName             string `json:"public_ip_name"`
	PublicIPID               string `json:"public_ip_id"`
	NetworkInterfaceName     string `json:"network_interface_name"`
	NetworkInterfaceID       string `json:"network_interface_id"`
	PrivateIP                string `json:"private_ip"`
	PublicIP                 string `json:"public_ip"`
	HostName                 string `json:"hostname"`
}

type AzureStateVMs

type AzureStateVMs struct {
	Names                    []string `json:"names"`
	NetworkSecurityGroupName string   `json:"network_security_group_name"`
	NetworkSecurityGroupID   string   `json:"network_security_group_id"`
	DiskNames                []string `json:"disk_names"`
	PublicIPNames            []string `json:"public_ip_names"`
	PublicIPIDs              []string `json:"public_ip_ids"`
	PrivateIPs               []string `json:"private_ips"`
	PublicIPs                []string `json:"public_ips"`
	NetworkInterfaceNames    []string `json:"network_interface_names"`
	NetworkInterfaceIDs      []string `json:"network_interface_ids"`
	Hostnames                []string `json:"hostnames"`
}

type Credential

type Credential struct {
	SubscriptionID string `json:"subscription_id"`
	TenantID       string `json:"tenant_id"`
	ClientID       string `json:"client_id"`
	ClientSecret   string `json:"client_secret"`
}

type Metadata

type Metadata struct {
	ResName string
	Role    string
	VmType  string
	Public  bool

	// purpose: application in managed cluster
	Apps    string
	Cni     string
	Version string

	// these are used for managing the state and are the size of the arrays
	NoCP int
	NoWP int
	NoDS int

	K8sName    string
	K8sVersion string
}

type StateConfiguration

type StateConfiguration struct {
	IsCompleted bool `json:"status"`

	ClusterName       string `json:"cluster_name"`
	Region            string `json:"region"`
	ResourceGroupName string `json:"resource_group_name"`

	// SSHID            string `json:"ssh_id"`
	SSHUser          string `json:"ssh_usr"`
	SSHPrivateKeyLoc string `json:"ssh_private_key_location"`
	SSHKeyName       string `json:"sshkey_name"`

	// ManagedCluster
	ManagedClusterName string `json:"managed_cluster_name"`
	NoManagedNodes     int    `json:"no_managed_cluster_nodes"`

	SubnetName         string        `json:"subnet_name"`
	SubnetID           string        `json:"subnet_id"`
	VirtualNetworkName string        `json:"virtual_network_name"`
	VirtualNetworkID   string        `json:"virtual_network_id"`
	InfoControlPlanes  AzureStateVMs `json:"info_control_planes"`
	InfoWorkerPlanes   AzureStateVMs `json:"info_worker_planes"`
	InfoDatabase       AzureStateVMs `json:"info_database"`
	InfoLoadBalancer   AzureStateVM  `json:"info_load_balancer"`

	KubernetesDistro string `json:"k8s_distro"`
	KubernetesVer    string `json:"k8s_version"`
}

Jump to

Keyboard shortcuts

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