123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167 |
- /*
- Copyright 2014 The Kubernetes Authors.
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
- http://www.apache.org/licenses/LICENSE-2.0
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- */
- package cloudprovider
- import (
- "errors"
- "fmt"
- "strings"
- "k8s.io/kubernetes/pkg/api"
- )
- // Interface is an abstract, pluggable interface for cloud providers.
- type Interface interface {
- // LoadBalancer returns a balancer interface. Also returns true if the interface is supported, false otherwise.
- LoadBalancer() (LoadBalancer, bool)
- // Instances returns an instances interface. Also returns true if the interface is supported, false otherwise.
- Instances() (Instances, bool)
- // Zones returns a zones interface. Also returns true if the interface is supported, false otherwise.
- Zones() (Zones, bool)
- // Clusters returns a clusters interface. Also returns true if the interface is supported, false otherwise.
- Clusters() (Clusters, bool)
- // Routes returns a routes interface along with whether the interface is supported.
- Routes() (Routes, bool)
- // ProviderName returns the cloud provider ID.
- ProviderName() string
- // ScrubDNS provides an opportunity for cloud-provider-specific code to process DNS settings for pods.
- ScrubDNS(nameservers, searches []string) (nsOut, srchOut []string)
- }
- // Clusters is an abstract, pluggable interface for clusters of containers.
- type Clusters interface {
- // ListClusters lists the names of the available clusters.
- ListClusters() ([]string, error)
- // Master gets back the address (either DNS name or IP address) of the master node for the cluster.
- Master(clusterName string) (string, error)
- }
- // TODO(#6812): Use a shorter name that's less likely to be longer than cloud
- // providers' name length limits.
- func GetLoadBalancerName(service *api.Service) string {
- //GCE requires that the name of a load balancer starts with a lower case letter.
- ret := "a" + string(service.UID)
- ret = strings.Replace(ret, "-", "", -1)
- //AWS requires that the name of a load balancer is shorter than 32 bytes.
- if len(ret) > 32 {
- ret = ret[:32]
- }
- return ret
- }
- func GetInstanceProviderID(cloud Interface, nodeName string) (string, error) {
- instances, ok := cloud.Instances()
- if !ok {
- return "", fmt.Errorf("failed to get instances from cloud provider")
- }
- instanceID, err := instances.InstanceID(nodeName)
- if err != nil {
- return "", fmt.Errorf("failed to get instance ID from cloud provider: %v", err)
- }
- return cloud.ProviderName() + "://" + instanceID, nil
- }
- // LoadBalancer is an abstract, pluggable interface for load balancers.
- type LoadBalancer interface {
- // TODO: Break this up into different interfaces (LB, etc) when we have more than one type of service
- // GetLoadBalancer returns whether the specified load balancer exists, and
- // if so, what its status is.
- // Implementations must treat the *api.Service parameter as read-only and not modify it.
- // Parameter 'clusterName' is the name of the cluster as presented to kube-controller-manager
- GetLoadBalancer(clusterName string, service *api.Service) (status *api.LoadBalancerStatus, exists bool, err error)
- // EnsureLoadBalancer creates a new load balancer 'name', or updates the existing one. Returns the status of the balancer
- // Implementations must treat the *api.Service parameter as read-only and not modify it.
- // Parameter 'clusterName' is the name of the cluster as presented to kube-controller-manager
- EnsureLoadBalancer(clusterName string, service *api.Service, hosts []string) (*api.LoadBalancerStatus, error)
- // UpdateLoadBalancer updates hosts under the specified load balancer.
- // Implementations must treat the *api.Service parameter as read-only and not modify it.
- // Parameter 'clusterName' is the name of the cluster as presented to kube-controller-manager
- UpdateLoadBalancer(clusterName string, service *api.Service, hosts []string) error
- // EnsureLoadBalancerDeleted deletes the specified load balancer if it
- // exists, returning nil if the load balancer specified either didn't exist or
- // was successfully deleted.
- // This construction is useful because many cloud providers' load balancers
- // have multiple underlying components, meaning a Get could say that the LB
- // doesn't exist even if some part of it is still laying around.
- // Implementations must treat the *api.Service parameter as read-only and not modify it.
- // Parameter 'clusterName' is the name of the cluster as presented to kube-controller-manager
- EnsureLoadBalancerDeleted(clusterName string, service *api.Service) error
- }
- // Instances is an abstract, pluggable interface for sets of instances.
- type Instances interface {
- // NodeAddresses returns the addresses of the specified instance.
- // TODO(roberthbailey): This currently is only used in such a way that it
- // returns the address of the calling instance. We should do a rename to
- // make this clearer.
- NodeAddresses(name string) ([]api.NodeAddress, error)
- // ExternalID returns the cloud provider ID of the specified instance (deprecated).
- // Note that if the instance does not exist or is no longer running, we must return ("", cloudprovider.InstanceNotFound)
- ExternalID(name string) (string, error)
- // InstanceID returns the cloud provider ID of the specified instance.
- InstanceID(name string) (string, error)
- // InstanceType returns the type of the specified instance.
- InstanceType(name string) (string, error)
- // List lists instances that match 'filter' which is a regular expression which must match the entire instance name (fqdn)
- List(filter string) ([]string, error)
- // AddSSHKeyToAllInstances adds an SSH public key as a legal identity for all instances
- // expected format for the key is standard ssh-keygen format: <protocol> <blob>
- AddSSHKeyToAllInstances(user string, keyData []byte) error
- // CurrentNodeName returns the name of the node we are currently running on
- // On most clouds (e.g. GCE) this is the hostname, so we provide the hostname
- CurrentNodeName(hostname string) (string, error)
- }
- // Route is a representation of an advanced routing rule.
- type Route struct {
- // Name is the name of the routing rule in the cloud-provider.
- // It will be ignored in a Create (although nameHint may influence it)
- Name string
- // TargetInstance is the name of the instance as specified in routing rules
- // for the cloud-provider (in gce: the Instance Name).
- TargetInstance string
- // DestinationCIDR is the CIDR format IP range that this routing rule
- // applies to.
- DestinationCIDR string
- }
- // Routes is an abstract, pluggable interface for advanced routing rules.
- type Routes interface {
- // ListRoutes lists all managed routes that belong to the specified clusterName
- ListRoutes(clusterName string) ([]*Route, error)
- // CreateRoute creates the described managed route
- // route.Name will be ignored, although the cloud-provider may use nameHint
- // to create a more user-meaningful name.
- CreateRoute(clusterName string, nameHint string, route *Route) error
- // DeleteRoute deletes the specified managed route
- // Route should be as returned by ListRoutes
- DeleteRoute(clusterName string, route *Route) error
- }
- var InstanceNotFound = errors.New("instance not found")
- // Zone represents the location of a particular machine.
- type Zone struct {
- FailureDomain string
- Region string
- }
- // Zones is an abstract, pluggable interface for zone enumeration.
- type Zones interface {
- // GetZone returns the Zone containing the current failure zone and locality region that the program is running in
- GetZone() (Zone, error)
- }
|