mirror of
				https://github.com/optim-enterprises-bv/kubernetes.git
				synced 2025-11-04 04:08:16 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			168 lines
		
	
	
		
			7.7 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			168 lines
		
	
	
		
			7.7 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
/*
 | 
						|
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)
 | 
						|
}
 |