mirror of
https://github.com/k3s-io/kubernetes.git
synced 2025-07-23 11:50:44 +00:00
let the caller log error message
This commit is contained in:
parent
191ff804ea
commit
8af03d0fae
@ -52,7 +52,7 @@ const (
|
|||||||
configDriveID = "configDrive"
|
configDriveID = "configDrive"
|
||||||
)
|
)
|
||||||
|
|
||||||
var ErrBadMetadata = errors.New("Invalid OpenStack metadata, got empty uuid")
|
var ErrBadMetadata = errors.New("invalid OpenStack metadata, got empty uuid")
|
||||||
|
|
||||||
// Assumes the "2012-08-10" meta_data.json format.
|
// Assumes the "2012-08-10" meta_data.json format.
|
||||||
// See http://docs.openstack.org/user-guide/cli_config_drive.html
|
// See http://docs.openstack.org/user-guide/cli_config_drive.html
|
||||||
@ -89,8 +89,7 @@ func getMetadataFromConfigDrive() (*Metadata, error) {
|
|||||||
"-o", "device",
|
"-o", "device",
|
||||||
).CombinedOutput()
|
).CombinedOutput()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
glog.V(2).Infof("Unable to run blkid: %v", err)
|
return nil, fmt.Errorf("unable to run blkid: %v", err)
|
||||||
return nil, err
|
|
||||||
}
|
}
|
||||||
dev = strings.TrimSpace(string(out))
|
dev = strings.TrimSpace(string(out))
|
||||||
}
|
}
|
||||||
@ -109,8 +108,7 @@ func getMetadataFromConfigDrive() (*Metadata, error) {
|
|||||||
err = mounter.Mount(dev, mntdir, "vfat", []string{"ro"})
|
err = mounter.Mount(dev, mntdir, "vfat", []string{"ro"})
|
||||||
}
|
}
|
||||||
if err != nil {
|
if err != nil {
|
||||||
glog.Errorf("Error mounting configdrive %s: %v", dev, err)
|
return nil, fmt.Errorf("error mounting configdrive %s: %v", dev, err)
|
||||||
return nil, err
|
|
||||||
}
|
}
|
||||||
defer mounter.Unmount(mntdir)
|
defer mounter.Unmount(mntdir)
|
||||||
|
|
||||||
@ -119,8 +117,7 @@ func getMetadataFromConfigDrive() (*Metadata, error) {
|
|||||||
f, err := os.Open(
|
f, err := os.Open(
|
||||||
filepath.Join(mntdir, configDrivePath))
|
filepath.Join(mntdir, configDrivePath))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
glog.Errorf("Error reading %s on config drive: %v", configDrivePath, err)
|
return nil, fmt.Errorf("error reading %s on config drive: %v", configDrivePath, err)
|
||||||
return nil, err
|
|
||||||
}
|
}
|
||||||
defer f.Close()
|
defer f.Close()
|
||||||
|
|
||||||
@ -128,18 +125,16 @@ func getMetadataFromConfigDrive() (*Metadata, error) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func getMetadataFromMetadataService() (*Metadata, error) {
|
func getMetadataFromMetadataService() (*Metadata, error) {
|
||||||
// Try to get JSON from metdata server.
|
// Try to get JSON from metadata server.
|
||||||
glog.V(4).Infof("Attempting to fetch metadata from %s", metadataUrl)
|
glog.V(4).Infof("Attempting to fetch metadata from %s", metadataUrl)
|
||||||
resp, err := http.Get(metadataUrl)
|
resp, err := http.Get(metadataUrl)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
glog.V(3).Infof("Cannot read %s: %v", metadataUrl, err)
|
return nil, fmt.Errorf("error fetching %s: %v", metadataUrl, err)
|
||||||
return nil, err
|
|
||||||
}
|
}
|
||||||
defer resp.Body.Close()
|
defer resp.Body.Close()
|
||||||
|
|
||||||
if resp.StatusCode != http.StatusOK {
|
if resp.StatusCode != http.StatusOK {
|
||||||
err = fmt.Errorf("Unexpected status code when reading metadata from %s: %s", metadataUrl, resp.Status)
|
err = fmt.Errorf("unexpected status code when reading metadata from %s: %s", metadataUrl, resp.Status)
|
||||||
glog.V(3).Infof("%v", err)
|
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -53,9 +53,9 @@ const (
|
|||||||
defaultTimeOut = 60 * time.Second
|
defaultTimeOut = 60 * time.Second
|
||||||
)
|
)
|
||||||
|
|
||||||
var ErrNotFound = errors.New("Failed to find object")
|
var ErrNotFound = errors.New("failed to find object")
|
||||||
var ErrMultipleResults = errors.New("Multiple results where only one expected")
|
var ErrMultipleResults = errors.New("multiple results where only one expected")
|
||||||
var ErrNoAddressFound = errors.New("No address found for host")
|
var ErrNoAddressFound = errors.New("no address found for host")
|
||||||
|
|
||||||
// encoding.TextUnmarshaler interface for time.Duration
|
// encoding.TextUnmarshaler interface for time.Duration
|
||||||
type MyDuration struct {
|
type MyDuration struct {
|
||||||
@ -179,8 +179,7 @@ func (cfg Config) toAuth3Options() tokens3.AuthOptions {
|
|||||||
|
|
||||||
func readConfig(config io.Reader) (Config, error) {
|
func readConfig(config io.Reader) (Config, error) {
|
||||||
if config == nil {
|
if config == nil {
|
||||||
err := fmt.Errorf("no OpenStack cloud provider config file given")
|
return Config{}, fmt.Errorf("no OpenStack cloud provider config file given")
|
||||||
return Config{}, err
|
|
||||||
}
|
}
|
||||||
|
|
||||||
var cfg Config
|
var cfg Config
|
||||||
@ -549,7 +548,6 @@ func isNotFound(err error) bool {
|
|||||||
|
|
||||||
func (os *OpenStack) Zones() (cloudprovider.Zones, bool) {
|
func (os *OpenStack) Zones() (cloudprovider.Zones, bool) {
|
||||||
glog.V(1).Info("Claiming to support Zones")
|
glog.V(1).Info("Claiming to support Zones")
|
||||||
|
|
||||||
return os, true
|
return os, true
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -563,8 +561,7 @@ func (os *OpenStack) GetZone() (cloudprovider.Zone, error) {
|
|||||||
FailureDomain: md.AvailabilityZone,
|
FailureDomain: md.AvailabilityZone,
|
||||||
Region: os.region,
|
Region: os.region,
|
||||||
}
|
}
|
||||||
glog.V(1).Infof("Current zone is %v", zone)
|
glog.V(4).Infof("Current zone is %v", zone)
|
||||||
|
|
||||||
return zone, nil
|
return zone, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -592,7 +589,6 @@ func (os *OpenStack) GetZoneByProviderID(providerID string) (cloudprovider.Zone,
|
|||||||
Region: os.region,
|
Region: os.region,
|
||||||
}
|
}
|
||||||
glog.V(4).Infof("The instance %s in zone %v", srv.Name, zone)
|
glog.V(4).Infof("The instance %s in zone %v", srv.Name, zone)
|
||||||
|
|
||||||
return zone, nil
|
return zone, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -618,7 +614,6 @@ func (os *OpenStack) GetZoneByNodeName(nodeName types.NodeName) (cloudprovider.Z
|
|||||||
Region: os.region,
|
Region: os.region,
|
||||||
}
|
}
|
||||||
glog.V(4).Infof("The instance %s in zone %v", srv.Name, zone)
|
glog.V(4).Infof("The instance %s in zone %v", srv.Name, zone)
|
||||||
|
|
||||||
return zone, nil
|
return zone, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -653,7 +648,6 @@ func (os *OpenStack) Routes() (cloudprovider.Routes, bool) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
glog.V(1).Info("Claiming to support Routes")
|
glog.V(1).Info("Claiming to support Routes")
|
||||||
|
|
||||||
return r, true
|
return r, true
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -703,19 +697,18 @@ func (os *OpenStack) volumeService(forceVersion string) (volumeService, error) {
|
|||||||
}
|
}
|
||||||
default:
|
default:
|
||||||
err_txt := fmt.Sprintf("Config error: unrecognised bs-version \"%v\"", os.bsOpts.BSVersion)
|
err_txt := fmt.Sprintf("Config error: unrecognised bs-version \"%v\"", os.bsOpts.BSVersion)
|
||||||
glog.Warningf(err_txt)
|
|
||||||
return nil, errors.New(err_txt)
|
return nil, errors.New(err_txt)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func checkMetadataSearchOrder(order string) error {
|
func checkMetadataSearchOrder(order string) error {
|
||||||
if order == "" {
|
if order == "" {
|
||||||
return errors.New("Invalid value in section [Metadata] with key `search-order`. Value cannot be empty")
|
return errors.New("invalid value in section [Metadata] with key `search-order`. Value cannot be empty")
|
||||||
}
|
}
|
||||||
|
|
||||||
elements := strings.Split(order, ",")
|
elements := strings.Split(order, ",")
|
||||||
if len(elements) > 2 {
|
if len(elements) > 2 {
|
||||||
return errors.New("Invalid value in section [Metadata] with key `search-order`. Value cannot contain more than 2 elements")
|
return errors.New("invalid value in section [Metadata] with key `search-order`. Value cannot contain more than 2 elements")
|
||||||
}
|
}
|
||||||
|
|
||||||
for _, id := range elements {
|
for _, id := range elements {
|
||||||
@ -724,9 +717,8 @@ func checkMetadataSearchOrder(order string) error {
|
|||||||
case configDriveID:
|
case configDriveID:
|
||||||
case metadataID:
|
case metadataID:
|
||||||
default:
|
default:
|
||||||
errTxt := "Invalid element '%s' found in section [Metadata] with key `search-order`." +
|
return fmt.Errorf("invalid element %q found in section [Metadata] with key `search-order`."+
|
||||||
"Supported elements include '%s' and '%s'"
|
"Supported elements include %q and %q", id, configDriveID, metadataID)
|
||||||
return fmt.Errorf(errTxt, id, configDriveID, metadataID)
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -17,10 +17,10 @@ limitations under the License.
|
|||||||
package openstack
|
package openstack
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"fmt"
|
||||||
|
|
||||||
"github.com/gophercloud/gophercloud"
|
"github.com/gophercloud/gophercloud"
|
||||||
"github.com/gophercloud/gophercloud/openstack"
|
"github.com/gophercloud/gophercloud/openstack"
|
||||||
|
|
||||||
"github.com/golang/glog"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
func (os *OpenStack) NewNetworkV2() (*gophercloud.ServiceClient, error) {
|
func (os *OpenStack) NewNetworkV2() (*gophercloud.ServiceClient, error) {
|
||||||
@ -28,8 +28,7 @@ func (os *OpenStack) NewNetworkV2() (*gophercloud.ServiceClient, error) {
|
|||||||
Region: os.region,
|
Region: os.region,
|
||||||
})
|
})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
glog.Warningf("Failed to find network v2 endpoint for region %s: %v", os.region, err)
|
return nil, fmt.Errorf("failed to find network v2 endpoint for region %s: %v", os.region, err)
|
||||||
return nil, err
|
|
||||||
}
|
}
|
||||||
return network, nil
|
return network, nil
|
||||||
}
|
}
|
||||||
@ -39,8 +38,7 @@ func (os *OpenStack) NewComputeV2() (*gophercloud.ServiceClient, error) {
|
|||||||
Region: os.region,
|
Region: os.region,
|
||||||
})
|
})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
glog.Warningf("Failed to find compute v2 endpoint for region %s: %v", os.region, err)
|
return nil, fmt.Errorf("failed to find compute v2 endpoint for region %s: %v", os.region, err)
|
||||||
return nil, err
|
|
||||||
}
|
}
|
||||||
return compute, nil
|
return compute, nil
|
||||||
}
|
}
|
||||||
@ -50,8 +48,7 @@ func (os *OpenStack) NewBlockStorageV1() (*gophercloud.ServiceClient, error) {
|
|||||||
Region: os.region,
|
Region: os.region,
|
||||||
})
|
})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
glog.Errorf("Unable to initialize cinder v1 client for region %s: %v", os.region, err)
|
return nil, fmt.Errorf("unable to initialize cinder v1 client for region %s: %v", os.region, err)
|
||||||
return nil, err
|
|
||||||
}
|
}
|
||||||
return storage, nil
|
return storage, nil
|
||||||
}
|
}
|
||||||
@ -61,8 +58,7 @@ func (os *OpenStack) NewBlockStorageV2() (*gophercloud.ServiceClient, error) {
|
|||||||
Region: os.region,
|
Region: os.region,
|
||||||
})
|
})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
glog.Errorf("Unable to initialize cinder v2 client for region %s: %v", os.region, err)
|
return nil, fmt.Errorf("unable to initialize cinder v2 client for region %s: %v", os.region, err)
|
||||||
return nil, err
|
|
||||||
}
|
}
|
||||||
return storage, nil
|
return storage, nil
|
||||||
}
|
}
|
||||||
|
@ -649,7 +649,7 @@ func (lbaas *LbaasV2) EnsureLoadBalancer(clusterName string, apiService *v1.Serv
|
|||||||
glog.V(4).Infof("EnsureLoadBalancer(%v, %v, %v, %v, %v, %v, %v)", clusterName, apiService.Namespace, apiService.Name, apiService.Spec.LoadBalancerIP, apiService.Spec.Ports, nodes, apiService.Annotations)
|
glog.V(4).Infof("EnsureLoadBalancer(%v, %v, %v, %v, %v, %v, %v)", clusterName, apiService.Namespace, apiService.Name, apiService.Spec.LoadBalancerIP, apiService.Spec.Ports, nodes, apiService.Annotations)
|
||||||
|
|
||||||
if len(nodes) == 0 {
|
if len(nodes) == 0 {
|
||||||
return nil, fmt.Errorf("There are no available nodes for LoadBalancer service %s/%s", apiService.Namespace, apiService.Name)
|
return nil, fmt.Errorf("there are no available nodes for LoadBalancer service %s/%s", apiService.Namespace, apiService.Name)
|
||||||
}
|
}
|
||||||
|
|
||||||
if len(lbaas.opts.SubnetId) == 0 {
|
if len(lbaas.opts.SubnetId) == 0 {
|
||||||
@ -658,7 +658,7 @@ func (lbaas *LbaasV2) EnsureLoadBalancer(clusterName string, apiService *v1.Serv
|
|||||||
subnetID, err := getSubnetIDForLB(lbaas.compute, *nodes[0])
|
subnetID, err := getSubnetIDForLB(lbaas.compute, *nodes[0])
|
||||||
if err != nil {
|
if err != nil {
|
||||||
glog.Warningf("Failed to find subnet-id for loadbalancer service %s/%s: %v", apiService.Namespace, apiService.Name, err)
|
glog.Warningf("Failed to find subnet-id for loadbalancer service %s/%s: %v", apiService.Namespace, apiService.Name, err)
|
||||||
return nil, fmt.Errorf("No subnet-id for service %s/%s : subnet-id not set in cloud provider config, "+
|
return nil, fmt.Errorf("no subnet-id for service %s/%s : subnet-id not set in cloud provider config, "+
|
||||||
"and failed to find subnet-id from OpenStack: %v", apiService.Namespace, apiService.Name, err)
|
"and failed to find subnet-id from OpenStack: %v", apiService.Namespace, apiService.Name, err)
|
||||||
}
|
}
|
||||||
lbaas.opts.SubnetId = subnetID
|
lbaas.opts.SubnetId = subnetID
|
||||||
@ -683,10 +683,10 @@ func (lbaas *LbaasV2) EnsureLoadBalancer(clusterName string, apiService *v1.Serv
|
|||||||
glog.V(4).Infof("Ensure an external loadbalancer service.")
|
glog.V(4).Infof("Ensure an external loadbalancer service.")
|
||||||
internalAnnotation = false
|
internalAnnotation = false
|
||||||
} else {
|
} else {
|
||||||
return nil, fmt.Errorf("floating-network-id or loadbalancer.openstack.org/floating-network-id should be specified when ensuring an external loadbalancer service.")
|
return nil, fmt.Errorf("floating-network-id or loadbalancer.openstack.org/floating-network-id should be specified when ensuring an external loadbalancer service")
|
||||||
}
|
}
|
||||||
default:
|
default:
|
||||||
return nil, fmt.Errorf("unknow service.beta.kubernetes.io/openstack-internal-load-balancer annotation: %v, specify \"true\" or \"false\".",
|
return nil, fmt.Errorf("unknown service.beta.kubernetes.io/openstack-internal-load-balancer annotation: %v, specify \"true\" or \"false\" ",
|
||||||
internal)
|
internal)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -694,17 +694,17 @@ func (lbaas *LbaasV2) EnsureLoadBalancer(clusterName string, apiService *v1.Serv
|
|||||||
// TODO: Convert all error messages to use an event recorder
|
// TODO: Convert all error messages to use an event recorder
|
||||||
for _, port := range ports {
|
for _, port := range ports {
|
||||||
if port.Protocol != v1.ProtocolTCP {
|
if port.Protocol != v1.ProtocolTCP {
|
||||||
return nil, fmt.Errorf("Only TCP LoadBalancer is supported for openstack load balancers")
|
return nil, fmt.Errorf("only TCP LoadBalancer is supported for openstack load balancers")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
sourceRanges, err := service.GetLoadBalancerSourceRanges(apiService)
|
sourceRanges, err := service.GetLoadBalancerSourceRanges(apiService)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("Failed to get source ranges for loadbalancer service %s/%s: %v", apiService.Namespace, apiService.Name, err)
|
return nil, fmt.Errorf("failed to get source ranges for loadbalancer service %s/%s: %v", apiService.Namespace, apiService.Name, err)
|
||||||
}
|
}
|
||||||
|
|
||||||
if !service.IsAllowAll(sourceRanges) && !lbaas.opts.ManageSecurityGroups {
|
if !service.IsAllowAll(sourceRanges) && !lbaas.opts.ManageSecurityGroups {
|
||||||
return nil, fmt.Errorf("Source range restrictions are not supported for openstack load balancers without managing security groups")
|
return nil, fmt.Errorf("source range restrictions are not supported for openstack load balancers without managing security groups")
|
||||||
}
|
}
|
||||||
|
|
||||||
affinity := apiService.Spec.SessionAffinity
|
affinity := apiService.Spec.SessionAffinity
|
||||||
@ -722,13 +722,13 @@ func (lbaas *LbaasV2) EnsureLoadBalancer(clusterName string, apiService *v1.Serv
|
|||||||
loadbalancer, err := getLoadbalancerByName(lbaas.network, name)
|
loadbalancer, err := getLoadbalancerByName(lbaas.network, name)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
if err != ErrNotFound {
|
if err != ErrNotFound {
|
||||||
return nil, fmt.Errorf("Error getting loadbalancer %s: %v", name, err)
|
return nil, fmt.Errorf("error getting loadbalancer %s: %v", name, err)
|
||||||
}
|
}
|
||||||
glog.V(2).Infof("Creating loadbalancer %s", name)
|
glog.V(2).Infof("Creating loadbalancer %s", name)
|
||||||
loadbalancer, err = lbaas.createLoadBalancer(apiService, name, internalAnnotation)
|
loadbalancer, err = lbaas.createLoadBalancer(apiService, name, internalAnnotation)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
// Unknown error, retry later
|
// Unknown error, retry later
|
||||||
return nil, fmt.Errorf("Error creating loadbalancer %s: %v", name, err)
|
return nil, fmt.Errorf("error creating loadbalancer %s: %v", name, err)
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
glog.V(2).Infof("LoadBalancer %s already exists", name)
|
glog.V(2).Infof("LoadBalancer %s already exists", name)
|
||||||
@ -743,7 +743,7 @@ func (lbaas *LbaasV2) EnsureLoadBalancer(clusterName string, apiService *v1.Serv
|
|||||||
|
|
||||||
oldListeners, err := getListenersByLoadBalancerID(lbaas.network, loadbalancer.ID)
|
oldListeners, err := getListenersByLoadBalancerID(lbaas.network, loadbalancer.ID)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("Error getting LB %s listeners: %v", name, err)
|
return nil, fmt.Errorf("error getting LB %s listeners: %v", name, err)
|
||||||
}
|
}
|
||||||
for portIndex, port := range ports {
|
for portIndex, port := range ports {
|
||||||
listener := getListenerForPort(oldListeners, port)
|
listener := getListenerForPort(oldListeners, port)
|
||||||
@ -757,7 +757,7 @@ func (lbaas *LbaasV2) EnsureLoadBalancer(clusterName string, apiService *v1.Serv
|
|||||||
}).Extract()
|
}).Extract()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
// Unknown error, retry later
|
// Unknown error, retry later
|
||||||
return nil, fmt.Errorf("Error creating LB listener: %v", err)
|
return nil, fmt.Errorf("error creating LB listener: %v", err)
|
||||||
}
|
}
|
||||||
waitLoadbalancerActiveProvisioningStatus(lbaas.network, loadbalancer.ID)
|
waitLoadbalancerActiveProvisioningStatus(lbaas.network, loadbalancer.ID)
|
||||||
}
|
}
|
||||||
@ -770,7 +770,7 @@ func (lbaas *LbaasV2) EnsureLoadBalancer(clusterName string, apiService *v1.Serv
|
|||||||
pool, err := getPoolByListenerID(lbaas.network, loadbalancer.ID, listener.ID)
|
pool, err := getPoolByListenerID(lbaas.network, loadbalancer.ID, listener.ID)
|
||||||
if err != nil && err != ErrNotFound {
|
if err != nil && err != ErrNotFound {
|
||||||
// Unknown error, retry later
|
// Unknown error, retry later
|
||||||
return nil, fmt.Errorf("Error getting pool for listener %s: %v", listener.ID, err)
|
return nil, fmt.Errorf("error getting pool for listener %s: %v", listener.ID, err)
|
||||||
}
|
}
|
||||||
if pool == nil {
|
if pool == nil {
|
||||||
glog.V(4).Infof("Creating pool for listener %s", listener.ID)
|
glog.V(4).Infof("Creating pool for listener %s", listener.ID)
|
||||||
@ -783,7 +783,7 @@ func (lbaas *LbaasV2) EnsureLoadBalancer(clusterName string, apiService *v1.Serv
|
|||||||
}).Extract()
|
}).Extract()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
// Unknown error, retry later
|
// Unknown error, retry later
|
||||||
return nil, fmt.Errorf("Error creating pool for listener %s: %v", listener.ID, err)
|
return nil, fmt.Errorf("error creating pool for listener %s: %v", listener.ID, err)
|
||||||
}
|
}
|
||||||
waitLoadbalancerActiveProvisioningStatus(lbaas.network, loadbalancer.ID)
|
waitLoadbalancerActiveProvisioningStatus(lbaas.network, loadbalancer.ID)
|
||||||
}
|
}
|
||||||
@ -791,7 +791,7 @@ func (lbaas *LbaasV2) EnsureLoadBalancer(clusterName string, apiService *v1.Serv
|
|||||||
glog.V(4).Infof("Pool for listener %s: %s", listener.ID, pool.ID)
|
glog.V(4).Infof("Pool for listener %s: %s", listener.ID, pool.ID)
|
||||||
members, err := getMembersByPoolID(lbaas.network, pool.ID)
|
members, err := getMembersByPoolID(lbaas.network, pool.ID)
|
||||||
if err != nil && !isNotFound(err) {
|
if err != nil && !isNotFound(err) {
|
||||||
return nil, fmt.Errorf("Error getting pool members %s: %v", pool.ID, err)
|
return nil, fmt.Errorf("error getting pool members %s: %v", pool.ID, err)
|
||||||
}
|
}
|
||||||
for _, node := range nodes {
|
for _, node := range nodes {
|
||||||
addr, err := nodeAddressForLB(node)
|
addr, err := nodeAddressForLB(node)
|
||||||
@ -801,7 +801,7 @@ func (lbaas *LbaasV2) EnsureLoadBalancer(clusterName string, apiService *v1.Serv
|
|||||||
glog.Warningf("Failed to create LB pool member for node %s: %v", node.Name, err)
|
glog.Warningf("Failed to create LB pool member for node %s: %v", node.Name, err)
|
||||||
continue
|
continue
|
||||||
} else {
|
} else {
|
||||||
return nil, fmt.Errorf("Error getting address for node %s: %v", node.Name, err)
|
return nil, fmt.Errorf("error getting address for node %s: %v", node.Name, err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -813,7 +813,7 @@ func (lbaas *LbaasV2) EnsureLoadBalancer(clusterName string, apiService *v1.Serv
|
|||||||
SubnetID: lbaas.opts.SubnetId,
|
SubnetID: lbaas.opts.SubnetId,
|
||||||
}).Extract()
|
}).Extract()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("Error creating LB pool member for node: %s, %v", node.Name, err)
|
return nil, fmt.Errorf("error creating LB pool member for node: %s, %v", node.Name, err)
|
||||||
}
|
}
|
||||||
|
|
||||||
waitLoadbalancerActiveProvisioningStatus(lbaas.network, loadbalancer.ID)
|
waitLoadbalancerActiveProvisioningStatus(lbaas.network, loadbalancer.ID)
|
||||||
@ -830,7 +830,7 @@ func (lbaas *LbaasV2) EnsureLoadBalancer(clusterName string, apiService *v1.Serv
|
|||||||
glog.V(4).Infof("Deleting obsolete member %s for pool %s address %s", member.ID, pool.ID, member.Address)
|
glog.V(4).Infof("Deleting obsolete member %s for pool %s address %s", member.ID, pool.ID, member.Address)
|
||||||
err := v2pools.DeleteMember(lbaas.network, pool.ID, member.ID).ExtractErr()
|
err := v2pools.DeleteMember(lbaas.network, pool.ID, member.ID).ExtractErr()
|
||||||
if err != nil && !isNotFound(err) {
|
if err != nil && !isNotFound(err) {
|
||||||
return nil, fmt.Errorf("Error deleting obsolete member %s for pool %s address %s: %v", member.ID, pool.ID, member.Address, err)
|
return nil, fmt.Errorf("error deleting obsolete member %s for pool %s address %s: %v", member.ID, pool.ID, member.Address, err)
|
||||||
}
|
}
|
||||||
waitLoadbalancerActiveProvisioningStatus(lbaas.network, loadbalancer.ID)
|
waitLoadbalancerActiveProvisioningStatus(lbaas.network, loadbalancer.ID)
|
||||||
}
|
}
|
||||||
@ -846,7 +846,7 @@ func (lbaas *LbaasV2) EnsureLoadBalancer(clusterName string, apiService *v1.Serv
|
|||||||
MaxRetries: int(lbaas.opts.MonitorMaxRetries),
|
MaxRetries: int(lbaas.opts.MonitorMaxRetries),
|
||||||
}).Extract()
|
}).Extract()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("Error creating LB pool healthmonitor: %v", err)
|
return nil, fmt.Errorf("error creating LB pool healthmonitor: %v", err)
|
||||||
}
|
}
|
||||||
waitLoadbalancerActiveProvisioningStatus(lbaas.network, loadbalancer.ID)
|
waitLoadbalancerActiveProvisioningStatus(lbaas.network, loadbalancer.ID)
|
||||||
monitorID = monitor.ID
|
monitorID = monitor.ID
|
||||||
@ -865,7 +865,7 @@ func (lbaas *LbaasV2) EnsureLoadBalancer(clusterName string, apiService *v1.Serv
|
|||||||
// get pool for listener
|
// get pool for listener
|
||||||
pool, err := getPoolByListenerID(lbaas.network, loadbalancer.ID, listener.ID)
|
pool, err := getPoolByListenerID(lbaas.network, loadbalancer.ID, listener.ID)
|
||||||
if err != nil && err != ErrNotFound {
|
if err != nil && err != ErrNotFound {
|
||||||
return nil, fmt.Errorf("Error getting pool for obsolete listener %s: %v", listener.ID, err)
|
return nil, fmt.Errorf("error getting pool for obsolete listener %s: %v", listener.ID, err)
|
||||||
}
|
}
|
||||||
if pool != nil {
|
if pool != nil {
|
||||||
// get and delete monitor
|
// get and delete monitor
|
||||||
@ -874,21 +874,21 @@ func (lbaas *LbaasV2) EnsureLoadBalancer(clusterName string, apiService *v1.Serv
|
|||||||
glog.V(4).Infof("Deleting obsolete monitor %s for pool %s", monitorID, pool.ID)
|
glog.V(4).Infof("Deleting obsolete monitor %s for pool %s", monitorID, pool.ID)
|
||||||
err = v2monitors.Delete(lbaas.network, monitorID).ExtractErr()
|
err = v2monitors.Delete(lbaas.network, monitorID).ExtractErr()
|
||||||
if err != nil && !isNotFound(err) {
|
if err != nil && !isNotFound(err) {
|
||||||
return nil, fmt.Errorf("Error deleting obsolete monitor %s for pool %s: %v", monitorID, pool.ID, err)
|
return nil, fmt.Errorf("error deleting obsolete monitor %s for pool %s: %v", monitorID, pool.ID, err)
|
||||||
}
|
}
|
||||||
waitLoadbalancerActiveProvisioningStatus(lbaas.network, loadbalancer.ID)
|
waitLoadbalancerActiveProvisioningStatus(lbaas.network, loadbalancer.ID)
|
||||||
}
|
}
|
||||||
// get and delete pool members
|
// get and delete pool members
|
||||||
members, err := getMembersByPoolID(lbaas.network, pool.ID)
|
members, err := getMembersByPoolID(lbaas.network, pool.ID)
|
||||||
if err != nil && !isNotFound(err) {
|
if err != nil && !isNotFound(err) {
|
||||||
return nil, fmt.Errorf("Error getting members for pool %s: %v", pool.ID, err)
|
return nil, fmt.Errorf("error getting members for pool %s: %v", pool.ID, err)
|
||||||
}
|
}
|
||||||
if members != nil {
|
if members != nil {
|
||||||
for _, member := range members {
|
for _, member := range members {
|
||||||
glog.V(4).Infof("Deleting obsolete member %s for pool %s address %s", member.ID, pool.ID, member.Address)
|
glog.V(4).Infof("Deleting obsolete member %s for pool %s address %s", member.ID, pool.ID, member.Address)
|
||||||
err := v2pools.DeleteMember(lbaas.network, pool.ID, member.ID).ExtractErr()
|
err := v2pools.DeleteMember(lbaas.network, pool.ID, member.ID).ExtractErr()
|
||||||
if err != nil && !isNotFound(err) {
|
if err != nil && !isNotFound(err) {
|
||||||
return nil, fmt.Errorf("Error deleting obsolete member %s for pool %s address %s: %v", member.ID, pool.ID, member.Address, err)
|
return nil, fmt.Errorf("error deleting obsolete member %s for pool %s address %s: %v", member.ID, pool.ID, member.Address, err)
|
||||||
}
|
}
|
||||||
waitLoadbalancerActiveProvisioningStatus(lbaas.network, loadbalancer.ID)
|
waitLoadbalancerActiveProvisioningStatus(lbaas.network, loadbalancer.ID)
|
||||||
}
|
}
|
||||||
@ -897,14 +897,14 @@ func (lbaas *LbaasV2) EnsureLoadBalancer(clusterName string, apiService *v1.Serv
|
|||||||
// delete pool
|
// delete pool
|
||||||
err = v2pools.Delete(lbaas.network, pool.ID).ExtractErr()
|
err = v2pools.Delete(lbaas.network, pool.ID).ExtractErr()
|
||||||
if err != nil && !isNotFound(err) {
|
if err != nil && !isNotFound(err) {
|
||||||
return nil, fmt.Errorf("Error deleting obsolete pool %s for listener %s: %v", pool.ID, listener.ID, err)
|
return nil, fmt.Errorf("error deleting obsolete pool %s for listener %s: %v", pool.ID, listener.ID, err)
|
||||||
}
|
}
|
||||||
waitLoadbalancerActiveProvisioningStatus(lbaas.network, loadbalancer.ID)
|
waitLoadbalancerActiveProvisioningStatus(lbaas.network, loadbalancer.ID)
|
||||||
}
|
}
|
||||||
// delete listener
|
// delete listener
|
||||||
err = listeners.Delete(lbaas.network, listener.ID).ExtractErr()
|
err = listeners.Delete(lbaas.network, listener.ID).ExtractErr()
|
||||||
if err != nil && !isNotFound(err) {
|
if err != nil && !isNotFound(err) {
|
||||||
return nil, fmt.Errorf("Error deleteting obsolete listener: %v", err)
|
return nil, fmt.Errorf("error deleteting obsolete listener: %v", err)
|
||||||
}
|
}
|
||||||
waitLoadbalancerActiveProvisioningStatus(lbaas.network, loadbalancer.ID)
|
waitLoadbalancerActiveProvisioningStatus(lbaas.network, loadbalancer.ID)
|
||||||
glog.V(2).Infof("Deleted obsolete listener: %s", listener.ID)
|
glog.V(2).Infof("Deleted obsolete listener: %s", listener.ID)
|
||||||
@ -913,7 +913,7 @@ func (lbaas *LbaasV2) EnsureLoadBalancer(clusterName string, apiService *v1.Serv
|
|||||||
portID := loadbalancer.VipPortID
|
portID := loadbalancer.VipPortID
|
||||||
floatIP, err := getFloatingIPByPortID(lbaas.network, portID)
|
floatIP, err := getFloatingIPByPortID(lbaas.network, portID)
|
||||||
if err != nil && err != ErrNotFound {
|
if err != nil && err != ErrNotFound {
|
||||||
return nil, fmt.Errorf("Error getting floating ip for port %s: %v", portID, err)
|
return nil, fmt.Errorf("error getting floating ip for port %s: %v", portID, err)
|
||||||
}
|
}
|
||||||
if floatIP == nil && floatingPool != "" && !internalAnnotation {
|
if floatIP == nil && floatingPool != "" && !internalAnnotation {
|
||||||
glog.V(4).Infof("Creating floating ip for loadbalancer %s port %s", loadbalancer.ID, portID)
|
glog.V(4).Infof("Creating floating ip for loadbalancer %s port %s", loadbalancer.ID, portID)
|
||||||
@ -929,7 +929,7 @@ func (lbaas *LbaasV2) EnsureLoadBalancer(clusterName string, apiService *v1.Serv
|
|||||||
|
|
||||||
floatIP, err = floatingips.Create(lbaas.network, floatIPOpts).Extract()
|
floatIP, err = floatingips.Create(lbaas.network, floatIPOpts).Extract()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("Error creating LB floatingip %+v: %v", floatIPOpts, err)
|
return nil, fmt.Errorf("error creating LB floatingip %+v: %v", floatIPOpts, err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -961,7 +961,7 @@ func (lbaas *LbaasV2) ensureSecurityGroup(clusterName string, apiService *v1.Ser
|
|||||||
if len(lbaas.opts.NodeSecurityGroupIDs) == 0 {
|
if len(lbaas.opts.NodeSecurityGroupIDs) == 0 {
|
||||||
lbaas.opts.NodeSecurityGroupIDs, err = getNodeSecurityGroupIDForLB(lbaas.compute, nodes)
|
lbaas.opts.NodeSecurityGroupIDs, err = getNodeSecurityGroupIDForLB(lbaas.compute, nodes)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("Failed to find node-security-group for loadbalancer service %s/%s: %v", apiService.Namespace, apiService.Name, err)
|
return fmt.Errorf("failed to find node-security-group for loadbalancer service %s/%s: %v", apiService.Namespace, apiService.Name, err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
glog.V(4).Infof("find node-security-group %v for loadbalancer service %s/%s", lbaas.opts.NodeSecurityGroupIDs, apiService.Namespace, apiService.Name)
|
glog.V(4).Infof("find node-security-group %v for loadbalancer service %s/%s", lbaas.opts.NodeSecurityGroupIDs, apiService.Namespace, apiService.Name)
|
||||||
@ -975,7 +975,7 @@ func (lbaas *LbaasV2) ensureSecurityGroup(clusterName string, apiService *v1.Ser
|
|||||||
// get service source ranges
|
// get service source ranges
|
||||||
sourceRanges, err := service.GetLoadBalancerSourceRanges(apiService)
|
sourceRanges, err := service.GetLoadBalancerSourceRanges(apiService)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("Failed to get source ranges for loadbalancer service %s/%s: %v", apiService.Namespace, apiService.Name, err)
|
return fmt.Errorf("failed to get source ranges for loadbalancer service %s/%s: %v", apiService.Namespace, apiService.Name, err)
|
||||||
}
|
}
|
||||||
|
|
||||||
// ensure security group for LB
|
// ensure security group for LB
|
||||||
@ -988,7 +988,7 @@ func (lbaas *LbaasV2) ensureSecurityGroup(clusterName string, apiService *v1.Ser
|
|||||||
// create it later
|
// create it later
|
||||||
lbSecGroupID = ""
|
lbSecGroupID = ""
|
||||||
} else {
|
} else {
|
||||||
return fmt.Errorf("Error occurred finding security group: %s: %v", lbSecGroupName, err)
|
return fmt.Errorf("error occurred finding security group: %s: %v", lbSecGroupName, err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if len(lbSecGroupID) == 0 {
|
if len(lbSecGroupID) == 0 {
|
||||||
@ -1000,7 +1000,7 @@ func (lbaas *LbaasV2) ensureSecurityGroup(clusterName string, apiService *v1.Ser
|
|||||||
|
|
||||||
lbSecGroup, err := groups.Create(lbaas.network, lbSecGroupCreateOpts).Extract()
|
lbSecGroup, err := groups.Create(lbaas.network, lbSecGroupCreateOpts).Extract()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("Failed to create Security Group for loadbalancer service %s/%s: %v", apiService.Namespace, apiService.Name, err)
|
return fmt.Errorf("failed to create Security Group for loadbalancer service %s/%s: %v", apiService.Namespace, apiService.Name, err)
|
||||||
}
|
}
|
||||||
lbSecGroupID = lbSecGroup.ID
|
lbSecGroupID = lbSecGroup.ID
|
||||||
|
|
||||||
@ -1011,7 +1011,7 @@ func (lbaas *LbaasV2) ensureSecurityGroup(clusterName string, apiService *v1.Ser
|
|||||||
network, _, err := net.ParseCIDR(sourceRange)
|
network, _, err := net.ParseCIDR(sourceRange)
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("Error parsing source range %s as a CIDR: %v", sourceRange, err)
|
return fmt.Errorf("error parsing source range %s as a CIDR: %v", sourceRange, err)
|
||||||
}
|
}
|
||||||
|
|
||||||
if network.To4() == nil {
|
if network.To4() == nil {
|
||||||
@ -1031,7 +1031,7 @@ func (lbaas *LbaasV2) ensureSecurityGroup(clusterName string, apiService *v1.Ser
|
|||||||
_, err = rules.Create(lbaas.network, lbSecGroupRuleCreateOpts).Extract()
|
_, err = rules.Create(lbaas.network, lbSecGroupRuleCreateOpts).Extract()
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("Error occured creating rule for SecGroup %s: %v", lbSecGroup.ID, err)
|
return fmt.Errorf("error occured creating rule for SecGroup %s: %v", lbSecGroup.ID, err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1049,7 +1049,7 @@ func (lbaas *LbaasV2) ensureSecurityGroup(clusterName string, apiService *v1.Ser
|
|||||||
_, err = rules.Create(lbaas.network, lbSecGroupRuleCreateOpts).Extract()
|
_, err = rules.Create(lbaas.network, lbSecGroupRuleCreateOpts).Extract()
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("Error occured creating rule for SecGroup %s: %v", lbSecGroup.ID, err)
|
return fmt.Errorf("error occured creating rule for SecGroup %s: %v", lbSecGroup.ID, err)
|
||||||
}
|
}
|
||||||
|
|
||||||
lbSecGroupRuleCreateOpts = rules.CreateOpts{
|
lbSecGroupRuleCreateOpts = rules.CreateOpts{
|
||||||
@ -1064,7 +1064,7 @@ func (lbaas *LbaasV2) ensureSecurityGroup(clusterName string, apiService *v1.Ser
|
|||||||
|
|
||||||
_, err = rules.Create(lbaas.network, lbSecGroupRuleCreateOpts).Extract()
|
_, err = rules.Create(lbaas.network, lbSecGroupRuleCreateOpts).Extract()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("Error occured creating rule for SecGroup %s: %v", lbSecGroup.ID, err)
|
return fmt.Errorf("error occured creating rule for SecGroup %s: %v", lbSecGroup.ID, err)
|
||||||
}
|
}
|
||||||
|
|
||||||
// get security groups of port
|
// get security groups of port
|
||||||
@ -1119,7 +1119,7 @@ func (lbaas *LbaasV2) ensureSecurityGroup(clusterName string, apiService *v1.Ser
|
|||||||
// Add the rules in the Node Security Group
|
// Add the rules in the Node Security Group
|
||||||
err = createNodeSecurityGroup(lbaas.network, nodeSecurityGroupID, int(port.NodePort), port.Protocol, lbSecGroupID)
|
err = createNodeSecurityGroup(lbaas.network, nodeSecurityGroupID, int(port.NodePort), port.Protocol, lbSecGroupID)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("Error occured creating security group for loadbalancer service %s/%s: %v", apiService.Namespace, apiService.Name, err)
|
return fmt.Errorf("error occured creating security group for loadbalancer service %s/%s: %v", apiService.Namespace, apiService.Name, err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1137,7 +1137,7 @@ func (lbaas *LbaasV2) UpdateLoadBalancer(clusterName string, service *v1.Service
|
|||||||
subnetID, err := getSubnetIDForLB(lbaas.compute, *nodes[0])
|
subnetID, err := getSubnetIDForLB(lbaas.compute, *nodes[0])
|
||||||
if err != nil {
|
if err != nil {
|
||||||
glog.Warningf("Failed to find subnet-id for loadbalancer service %s/%s: %v", service.Namespace, service.Name, err)
|
glog.Warningf("Failed to find subnet-id for loadbalancer service %s/%s: %v", service.Namespace, service.Name, err)
|
||||||
return fmt.Errorf("No subnet-id for service %s/%s : subnet-id not set in cloud provider config, "+
|
return fmt.Errorf("no subnet-id for service %s/%s : subnet-id not set in cloud provider config, "+
|
||||||
"and failed to find subnet-id from OpenStack: %v", service.Namespace, service.Name, err)
|
"and failed to find subnet-id from OpenStack: %v", service.Namespace, service.Name, err)
|
||||||
}
|
}
|
||||||
lbaas.opts.SubnetId = subnetID
|
lbaas.opts.SubnetId = subnetID
|
||||||
@ -1153,7 +1153,7 @@ func (lbaas *LbaasV2) UpdateLoadBalancer(clusterName string, service *v1.Service
|
|||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
if loadbalancer == nil {
|
if loadbalancer == nil {
|
||||||
return fmt.Errorf("Loadbalancer %s does not exist", loadBalancerName)
|
return fmt.Errorf("loadbalancer %s does not exist", loadBalancerName)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Get all listeners for this loadbalancer, by "port key".
|
// Get all listeners for this loadbalancer, by "port key".
|
||||||
@ -1165,7 +1165,7 @@ func (lbaas *LbaasV2) UpdateLoadBalancer(clusterName string, service *v1.Service
|
|||||||
lbListeners := make(map[portKey]listeners.Listener)
|
lbListeners := make(map[portKey]listeners.Listener)
|
||||||
allListeners, err := getListenersByLoadBalancerID(lbaas.network, loadbalancer.ID)
|
allListeners, err := getListenersByLoadBalancerID(lbaas.network, loadbalancer.ID)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("Error getting listeners for LB %s: %v", loadBalancerName, err)
|
return fmt.Errorf("error getting listeners for LB %s: %v", loadBalancerName, err)
|
||||||
}
|
}
|
||||||
for _, l := range allListeners {
|
for _, l := range allListeners {
|
||||||
key := portKey{Protocol: listeners.Protocol(l.Protocol), Port: l.ProtocolPort}
|
key := portKey{Protocol: listeners.Protocol(l.Protocol), Port: l.ProtocolPort}
|
||||||
@ -1178,7 +1178,7 @@ func (lbaas *LbaasV2) UpdateLoadBalancer(clusterName string, service *v1.Service
|
|||||||
for _, listenerID := range listenerIDs {
|
for _, listenerID := range listenerIDs {
|
||||||
pool, err := getPoolByListenerID(lbaas.network, loadbalancer.ID, listenerID)
|
pool, err := getPoolByListenerID(lbaas.network, loadbalancer.ID, listenerID)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("Error getting pool for listener %s: %v", listenerID, err)
|
return fmt.Errorf("error getting pool for listener %s: %v", listenerID, err)
|
||||||
}
|
}
|
||||||
lbPools[listenerID] = *pool
|
lbPools[listenerID] = *pool
|
||||||
}
|
}
|
||||||
@ -1201,19 +1201,19 @@ func (lbaas *LbaasV2) UpdateLoadBalancer(clusterName string, service *v1.Service
|
|||||||
Port: int(port.Port),
|
Port: int(port.Port),
|
||||||
}]
|
}]
|
||||||
if !ok {
|
if !ok {
|
||||||
return fmt.Errorf("Loadbalancer %s does not contain required listener for port %d and protocol %s", loadBalancerName, port.Port, port.Protocol)
|
return fmt.Errorf("loadbalancer %s does not contain required listener for port %d and protocol %s", loadBalancerName, port.Port, port.Protocol)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Get pool associated with this listener
|
// Get pool associated with this listener
|
||||||
pool, ok := lbPools[listener.ID]
|
pool, ok := lbPools[listener.ID]
|
||||||
if !ok {
|
if !ok {
|
||||||
return fmt.Errorf("Loadbalancer %s does not contain required pool for listener %s", loadBalancerName, listener.ID)
|
return fmt.Errorf("loadbalancer %s does not contain required pool for listener %s", loadBalancerName, listener.ID)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Find existing pool members (by address) for this port
|
// Find existing pool members (by address) for this port
|
||||||
getMembers, err := getMembersByPoolID(lbaas.network, pool.ID)
|
getMembers, err := getMembersByPoolID(lbaas.network, pool.ID)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("Error getting pool members %s: %v", pool.ID, err)
|
return fmt.Errorf("error getting pool members %s: %v", pool.ID, err)
|
||||||
}
|
}
|
||||||
members := make(map[string]v2pools.Member)
|
members := make(map[string]v2pools.Member)
|
||||||
for _, member := range getMembers {
|
for _, member := range getMembers {
|
||||||
@ -1254,7 +1254,7 @@ func (lbaas *LbaasV2) UpdateLoadBalancer(clusterName string, service *v1.Service
|
|||||||
if lbaas.opts.ManageSecurityGroups {
|
if lbaas.opts.ManageSecurityGroups {
|
||||||
err := lbaas.updateSecurityGroup(clusterName, service, nodes, loadbalancer)
|
err := lbaas.updateSecurityGroup(clusterName, service, nodes, loadbalancer)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("Failed to update Securty Group for loadbalancer service %s/%s: %v", service.Namespace, service.Name, err)
|
return fmt.Errorf("failed to update Securty Group for loadbalancer service %s/%s: %v", service.Namespace, service.Name, err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1268,7 +1268,7 @@ func (lbaas *LbaasV2) updateSecurityGroup(clusterName string, apiService *v1.Ser
|
|||||||
var err error
|
var err error
|
||||||
lbaas.opts.NodeSecurityGroupIDs, err = getNodeSecurityGroupIDForLB(lbaas.compute, nodes)
|
lbaas.opts.NodeSecurityGroupIDs, err = getNodeSecurityGroupIDForLB(lbaas.compute, nodes)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("Failed to find node-security-group for loadbalancer service %s/%s: %v", apiService.Namespace, apiService.Name, err)
|
return fmt.Errorf("failed to find node-security-group for loadbalancer service %s/%s: %v", apiService.Namespace, apiService.Name, err)
|
||||||
}
|
}
|
||||||
glog.V(4).Infof("find node-security-group %v for loadbalancer service %s/%s", lbaas.opts.NodeSecurityGroupIDs, apiService.Namespace, apiService.Name)
|
glog.V(4).Infof("find node-security-group %v for loadbalancer service %s/%s", lbaas.opts.NodeSecurityGroupIDs, apiService.Namespace, apiService.Name)
|
||||||
|
|
||||||
@ -1280,7 +1280,7 @@ func (lbaas *LbaasV2) updateSecurityGroup(clusterName string, apiService *v1.Ser
|
|||||||
lbSecGroupName := getSecurityGroupName(clusterName, apiService)
|
lbSecGroupName := getSecurityGroupName(clusterName, apiService)
|
||||||
lbSecGroupID, err := groups.IDFromName(lbaas.network, lbSecGroupName)
|
lbSecGroupID, err := groups.IDFromName(lbaas.network, lbSecGroupName)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("Error occurred finding security group: %s: %v", lbSecGroupName, err)
|
return fmt.Errorf("error occurred finding security group: %s: %v", lbSecGroupName, err)
|
||||||
}
|
}
|
||||||
|
|
||||||
ports := apiService.Spec.Ports
|
ports := apiService.Spec.Ports
|
||||||
@ -1301,14 +1301,13 @@ func (lbaas *LbaasV2) updateSecurityGroup(clusterName string, apiService *v1.Ser
|
|||||||
}
|
}
|
||||||
secGroupRules, err := getSecurityGroupRules(lbaas.network, opts)
|
secGroupRules, err := getSecurityGroupRules(lbaas.network, opts)
|
||||||
if err != nil && !isNotFound(err) {
|
if err != nil && !isNotFound(err) {
|
||||||
msg := fmt.Sprintf("Error finding rules for remote group id %s in security group id %s: %v", lbSecGroupID, removal, err)
|
return fmt.Errorf("error finding rules for remote group id %s in security group id %s: %v", lbSecGroupID, removal, err)
|
||||||
return fmt.Errorf(msg)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
for _, rule := range secGroupRules {
|
for _, rule := range secGroupRules {
|
||||||
res := rules.Delete(lbaas.network, rule.ID)
|
res := rules.Delete(lbaas.network, rule.ID)
|
||||||
if res.Err != nil && !isNotFound(res.Err) {
|
if res.Err != nil && !isNotFound(res.Err) {
|
||||||
return fmt.Errorf("Error occurred deleting security group rule: %s: %v", rule.ID, res.Err)
|
return fmt.Errorf("error occurred deleting security group rule: %s: %v", rule.ID, res.Err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1324,8 +1323,7 @@ func (lbaas *LbaasV2) updateSecurityGroup(clusterName string, apiService *v1.Ser
|
|||||||
}
|
}
|
||||||
secGroupRules, err := getSecurityGroupRules(lbaas.network, opts)
|
secGroupRules, err := getSecurityGroupRules(lbaas.network, opts)
|
||||||
if err != nil && !isNotFound(err) {
|
if err != nil && !isNotFound(err) {
|
||||||
msg := fmt.Sprintf("Error finding rules for remote group id %s in security group id %s: %v", lbSecGroupID, nodeSecurityGroupID, err)
|
return fmt.Errorf("error finding rules for remote group id %s in security group id %s: %v", lbSecGroupID, nodeSecurityGroupID, err)
|
||||||
return fmt.Errorf(msg)
|
|
||||||
}
|
}
|
||||||
if len(secGroupRules) != 0 {
|
if len(secGroupRules) != 0 {
|
||||||
// Do not add rule when find rules for remote group in the Node Security Group
|
// Do not add rule when find rules for remote group in the Node Security Group
|
||||||
@ -1335,7 +1333,7 @@ func (lbaas *LbaasV2) updateSecurityGroup(clusterName string, apiService *v1.Ser
|
|||||||
// Add the rules in the Node Security Group
|
// Add the rules in the Node Security Group
|
||||||
err = createNodeSecurityGroup(lbaas.network, nodeSecurityGroupID, int(port.NodePort), port.Protocol, lbSecGroupID)
|
err = createNodeSecurityGroup(lbaas.network, nodeSecurityGroupID, int(port.NodePort), port.Protocol, lbSecGroupID)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("Error occured creating security group for loadbalancer service %s/%s: %v", apiService.Namespace, apiService.Name, err)
|
return fmt.Errorf("error occured creating security group for loadbalancer service %s/%s: %v", apiService.Namespace, apiService.Name, err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1372,7 +1370,7 @@ func (lbaas *LbaasV2) EnsureLoadBalancerDeleted(clusterName string, service *v1.
|
|||||||
// get all listeners associated with this loadbalancer
|
// get all listeners associated with this loadbalancer
|
||||||
listenerList, err := getListenersByLoadBalancerID(lbaas.network, loadbalancer.ID)
|
listenerList, err := getListenersByLoadBalancerID(lbaas.network, loadbalancer.ID)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("Error getting LB %s listeners: %v", loadbalancer.ID, err)
|
return fmt.Errorf("error getting LB %s listeners: %v", loadbalancer.ID, err)
|
||||||
}
|
}
|
||||||
|
|
||||||
// get all pools (and health monitors) associated with this loadbalancer
|
// get all pools (and health monitors) associated with this loadbalancer
|
||||||
@ -1381,7 +1379,7 @@ func (lbaas *LbaasV2) EnsureLoadBalancerDeleted(clusterName string, service *v1.
|
|||||||
for _, listener := range listenerList {
|
for _, listener := range listenerList {
|
||||||
pool, err := getPoolByListenerID(lbaas.network, loadbalancer.ID, listener.ID)
|
pool, err := getPoolByListenerID(lbaas.network, loadbalancer.ID, listener.ID)
|
||||||
if err != nil && err != ErrNotFound {
|
if err != nil && err != ErrNotFound {
|
||||||
return fmt.Errorf("Error getting pool for listener %s: %v", listener.ID, err)
|
return fmt.Errorf("error getting pool for listener %s: %v", listener.ID, err)
|
||||||
}
|
}
|
||||||
if pool != nil {
|
if pool != nil {
|
||||||
poolIDs = append(poolIDs, pool.ID)
|
poolIDs = append(poolIDs, pool.ID)
|
||||||
@ -1397,7 +1395,7 @@ func (lbaas *LbaasV2) EnsureLoadBalancerDeleted(clusterName string, service *v1.
|
|||||||
for _, pool := range poolIDs {
|
for _, pool := range poolIDs {
|
||||||
membersList, err := getMembersByPoolID(lbaas.network, pool)
|
membersList, err := getMembersByPoolID(lbaas.network, pool)
|
||||||
if err != nil && !isNotFound(err) {
|
if err != nil && !isNotFound(err) {
|
||||||
return fmt.Errorf("Error getting pool members %s: %v", pool, err)
|
return fmt.Errorf("error getting pool members %s: %v", pool, err)
|
||||||
}
|
}
|
||||||
for _, member := range membersList {
|
for _, member := range membersList {
|
||||||
memberIDs = append(memberIDs, member.ID)
|
memberIDs = append(memberIDs, member.ID)
|
||||||
@ -1460,7 +1458,7 @@ func (lbaas *LbaasV2) EnsureLoadBalancerDeleted(clusterName string, service *v1.
|
|||||||
// It is OK when the security group has been deleted by others.
|
// It is OK when the security group has been deleted by others.
|
||||||
return nil
|
return nil
|
||||||
} else {
|
} else {
|
||||||
return fmt.Errorf("Error occurred finding security group: %s: %v", lbSecGroupName, err)
|
return fmt.Errorf("error occurred finding security group: %s: %v", lbSecGroupName, err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1492,7 +1490,7 @@ func (lbaas *LbaasV2) EnsureLoadBalancerDeleted(clusterName string, service *v1.
|
|||||||
for _, rule := range secGroupRules {
|
for _, rule := range secGroupRules {
|
||||||
res := rules.Delete(lbaas.network, rule.ID)
|
res := rules.Delete(lbaas.network, rule.ID)
|
||||||
if res.Err != nil && !isNotFound(res.Err) {
|
if res.Err != nil && !isNotFound(res.Err) {
|
||||||
return fmt.Errorf("Error occurred deleting security group rule: %s: %v", rule.ID, res.Err)
|
return fmt.Errorf("error occurred deleting security group rule: %s: %v", rule.ID, res.Err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1517,7 +1515,7 @@ func (lb *LbaasV1) GetLoadBalancer(clusterName string, service *v1.Service) (*v1
|
|||||||
if vip.PortID != "" {
|
if vip.PortID != "" {
|
||||||
floatingIP, err := getFloatingIPByPortID(lb.network, vip.PortID)
|
floatingIP, err := getFloatingIPByPortID(lb.network, vip.PortID)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, false, fmt.Errorf("Error getting floating ip for port %s: %v", vip.PortID, err)
|
return nil, false, fmt.Errorf("error getting floating ip for port %s: %v", vip.PortID, err)
|
||||||
}
|
}
|
||||||
status.Ingress = []v1.LoadBalancerIngress{{IP: floatingIP.FloatingIP}}
|
status.Ingress = []v1.LoadBalancerIngress{{IP: floatingIP.FloatingIP}}
|
||||||
} else {
|
} else {
|
||||||
@ -1536,7 +1534,7 @@ func (lb *LbaasV1) EnsureLoadBalancer(clusterName string, apiService *v1.Service
|
|||||||
glog.V(4).Infof("EnsureLoadBalancer(%v, %v, %v, %v, %v, %v, %v)", clusterName, apiService.Namespace, apiService.Name, apiService.Spec.LoadBalancerIP, apiService.Spec.Ports, nodes, apiService.Annotations)
|
glog.V(4).Infof("EnsureLoadBalancer(%v, %v, %v, %v, %v, %v, %v)", clusterName, apiService.Namespace, apiService.Name, apiService.Spec.LoadBalancerIP, apiService.Spec.Ports, nodes, apiService.Annotations)
|
||||||
|
|
||||||
if len(nodes) == 0 {
|
if len(nodes) == 0 {
|
||||||
return nil, fmt.Errorf("There are no available nodes for LoadBalancer service %s/%s", apiService.Namespace, apiService.Name)
|
return nil, fmt.Errorf("there are no available nodes for LoadBalancer service %s/%s", apiService.Namespace, apiService.Name)
|
||||||
}
|
}
|
||||||
|
|
||||||
if len(lb.opts.SubnetId) == 0 {
|
if len(lb.opts.SubnetId) == 0 {
|
||||||
@ -1545,7 +1543,7 @@ func (lb *LbaasV1) EnsureLoadBalancer(clusterName string, apiService *v1.Service
|
|||||||
subnetID, err := getSubnetIDForLB(lb.compute, *nodes[0])
|
subnetID, err := getSubnetIDForLB(lb.compute, *nodes[0])
|
||||||
if err != nil {
|
if err != nil {
|
||||||
glog.Warningf("Failed to find subnet-id for loadbalancer service %s/%s: %v", apiService.Namespace, apiService.Name, err)
|
glog.Warningf("Failed to find subnet-id for loadbalancer service %s/%s: %v", apiService.Namespace, apiService.Name, err)
|
||||||
return nil, fmt.Errorf("No subnet-id for service %s/%s : subnet-id not set in cloud provider config, "+
|
return nil, fmt.Errorf("no subnet-id for service %s/%s : subnet-id not set in cloud provider config, "+
|
||||||
"and failed to find subnet-id from OpenStack: %v", apiService.Namespace, apiService.Name, err)
|
"and failed to find subnet-id from OpenStack: %v", apiService.Namespace, apiService.Name, err)
|
||||||
}
|
}
|
||||||
lb.opts.SubnetId = subnetID
|
lb.opts.SubnetId = subnetID
|
||||||
@ -1565,10 +1563,10 @@ func (lb *LbaasV1) EnsureLoadBalancer(clusterName string, apiService *v1.Service
|
|||||||
glog.V(4).Infof("Ensure an external loadbalancer service.")
|
glog.V(4).Infof("Ensure an external loadbalancer service.")
|
||||||
internalAnnotation = false
|
internalAnnotation = false
|
||||||
} else {
|
} else {
|
||||||
return nil, fmt.Errorf("floating-network-id or loadbalancer.openstack.org/floating-network-id should be specified when ensuring an external loadbalancer service.")
|
return nil, fmt.Errorf("floating-network-id or loadbalancer.openstack.org/floating-network-id should be specified when ensuring an external loadbalancer service")
|
||||||
}
|
}
|
||||||
default:
|
default:
|
||||||
return nil, fmt.Errorf("unknow service.beta.kubernetes.io/openstack-internal-load-balancer annotation: %v, specify \"true\" or \"false\".",
|
return nil, fmt.Errorf("unknown service.beta.kubernetes.io/openstack-internal-load-balancer annotation: %v, specify \"true\" or \"false\" ",
|
||||||
internal)
|
internal)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1582,7 +1580,7 @@ func (lb *LbaasV1) EnsureLoadBalancer(clusterName string, apiService *v1.Service
|
|||||||
// The service controller verified all the protocols match on the ports, just check and use the first one
|
// The service controller verified all the protocols match on the ports, just check and use the first one
|
||||||
// TODO: Convert all error messages to use an event recorder
|
// TODO: Convert all error messages to use an event recorder
|
||||||
if ports[0].Protocol != v1.ProtocolTCP {
|
if ports[0].Protocol != v1.ProtocolTCP {
|
||||||
return nil, fmt.Errorf("Only TCP LoadBalancer is supported for openstack load balancers")
|
return nil, fmt.Errorf("only TCP LoadBalancer is supported for openstack load balancers")
|
||||||
}
|
}
|
||||||
|
|
||||||
affinity := apiService.Spec.SessionAffinity
|
affinity := apiService.Spec.SessionAffinity
|
||||||
@ -1602,7 +1600,7 @@ func (lb *LbaasV1) EnsureLoadBalancer(clusterName string, apiService *v1.Service
|
|||||||
}
|
}
|
||||||
|
|
||||||
if !service.IsAllowAll(sourceRanges) {
|
if !service.IsAllowAll(sourceRanges) {
|
||||||
return nil, fmt.Errorf("Source range restrictions are not supported for openstack load balancers")
|
return nil, fmt.Errorf("source range restrictions are not supported for openstack load balancers")
|
||||||
}
|
}
|
||||||
|
|
||||||
glog.V(2).Infof("Checking if openstack load balancer already exists: %s", cloudprovider.GetLoadBalancerName(apiService))
|
glog.V(2).Infof("Checking if openstack load balancer already exists: %s", cloudprovider.GetLoadBalancerName(apiService))
|
||||||
@ -1632,7 +1630,7 @@ func (lb *LbaasV1) EnsureLoadBalancer(clusterName string, apiService *v1.Service
|
|||||||
LBMethod: lbmethod,
|
LBMethod: lbmethod,
|
||||||
}).Extract()
|
}).Extract()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("Error creating pool for openstack load balancer %s: %v", name, err)
|
return nil, fmt.Errorf("error creating pool for openstack load balancer %s: %v", name, err)
|
||||||
}
|
}
|
||||||
|
|
||||||
for _, node := range nodes {
|
for _, node := range nodes {
|
||||||
@ -1647,7 +1645,7 @@ func (lb *LbaasV1) EnsureLoadBalancer(clusterName string, apiService *v1.Service
|
|||||||
Address: addr,
|
Address: addr,
|
||||||
}).Extract()
|
}).Extract()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("Error creating member for the pool(%s) of openstack load balancer %s: %v",
|
return nil, fmt.Errorf("error creating member for the pool(%s) of openstack load balancer %s: %v",
|
||||||
pool.ID, name, err)
|
pool.ID, name, err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1661,12 +1659,12 @@ func (lb *LbaasV1) EnsureLoadBalancer(clusterName string, apiService *v1.Service
|
|||||||
MaxRetries: int(lb.opts.MonitorMaxRetries),
|
MaxRetries: int(lb.opts.MonitorMaxRetries),
|
||||||
}).Extract()
|
}).Extract()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("Error creating monitor for openstack load balancer %s: %v", name, err)
|
return nil, fmt.Errorf("error creating monitor for openstack load balancer %s: %v", name, err)
|
||||||
}
|
}
|
||||||
|
|
||||||
_, err = pools.AssociateMonitor(lb.network, pool.ID, mon.ID).Extract()
|
_, err = pools.AssociateMonitor(lb.network, pool.ID, mon.ID).Extract()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("Error associating monitor(%s) with pool(%s) for"+
|
return nil, fmt.Errorf("error associating monitor(%s) with pool(%s) for"+
|
||||||
"openstack load balancer %s: %v", mon.ID, pool.ID, name, err)
|
"openstack load balancer %s: %v", mon.ID, pool.ID, name, err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1688,7 +1686,7 @@ func (lb *LbaasV1) EnsureLoadBalancer(clusterName string, apiService *v1.Service
|
|||||||
|
|
||||||
vip, err := vips.Create(lb.network, createOpts).Extract()
|
vip, err := vips.Create(lb.network, createOpts).Extract()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("Error creating vip for openstack load balancer %s: %v", name, err)
|
return nil, fmt.Errorf("error creating vip for openstack load balancer %s: %v", name, err)
|
||||||
}
|
}
|
||||||
|
|
||||||
status := &v1.LoadBalancerStatus{}
|
status := &v1.LoadBalancerStatus{}
|
||||||
@ -1705,7 +1703,7 @@ func (lb *LbaasV1) EnsureLoadBalancer(clusterName string, apiService *v1.Service
|
|||||||
|
|
||||||
floatIP, err := floatingips.Create(lb.network, floatIPOpts).Extract()
|
floatIP, err := floatingips.Create(lb.network, floatIPOpts).Extract()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("Error creating floatingip for openstack load balancer %s: %v", name, err)
|
return nil, fmt.Errorf("error creating floatingip for openstack load balancer %s: %v", name, err)
|
||||||
}
|
}
|
||||||
|
|
||||||
status.Ingress = []v1.LoadBalancerIngress{{IP: floatIP.FloatingIP}}
|
status.Ingress = []v1.LoadBalancerIngress{{IP: floatIP.FloatingIP}}
|
||||||
|
@ -227,7 +227,7 @@ func TestCheckOpenStackOpts(t *testing.T) {
|
|||||||
SearchOrder: "",
|
SearchOrder: "",
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
expectedError: fmt.Errorf("Invalid value in section [Metadata] with key `search-order`. Value cannot be empty"),
|
expectedError: fmt.Errorf("invalid value in section [Metadata] with key `search-order`. Value cannot be empty"),
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "test5",
|
name: "test5",
|
||||||
@ -237,7 +237,7 @@ func TestCheckOpenStackOpts(t *testing.T) {
|
|||||||
SearchOrder: "value1,value2,value3",
|
SearchOrder: "value1,value2,value3",
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
expectedError: fmt.Errorf("Invalid value in section [Metadata] with key `search-order`. Value cannot contain more than 2 elements"),
|
expectedError: fmt.Errorf("invalid value in section [Metadata] with key `search-order`. Value cannot contain more than 2 elements"),
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "test6",
|
name: "test6",
|
||||||
@ -247,8 +247,8 @@ func TestCheckOpenStackOpts(t *testing.T) {
|
|||||||
SearchOrder: "value1",
|
SearchOrder: "value1",
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
expectedError: fmt.Errorf("Invalid element '%s' found in section [Metadata] with key `search-order`."+
|
expectedError: fmt.Errorf("invalid element %q found in section [Metadata] with key `search-order`."+
|
||||||
"Supported elements include '%s' and '%s'", "value1", configDriveID, metadataID),
|
"Supported elements include %q and %q", "value1", configDriveID, metadataID),
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -17,7 +17,6 @@ limitations under the License.
|
|||||||
package openstack
|
package openstack
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"errors"
|
|
||||||
"fmt"
|
"fmt"
|
||||||
"io/ioutil"
|
"io/ioutil"
|
||||||
"path"
|
"path"
|
||||||
@ -127,8 +126,7 @@ func (volumes *VolumesV1) getVolume(volumeID string) (Volume, error) {
|
|||||||
timeTaken := time.Since(startTime).Seconds()
|
timeTaken := time.Since(startTime).Seconds()
|
||||||
recordOpenstackOperationMetric("get_v1_volume", timeTaken, err)
|
recordOpenstackOperationMetric("get_v1_volume", timeTaken, err)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
glog.Errorf("Error occurred getting volume by ID: %s", volumeID)
|
return Volume{}, fmt.Errorf("error occurred getting volume by ID: %s, err: %v", volumeID, err)
|
||||||
return Volume{}, err
|
|
||||||
}
|
}
|
||||||
|
|
||||||
volume := Volume{
|
volume := Volume{
|
||||||
@ -151,8 +149,7 @@ func (volumes *VolumesV2) getVolume(volumeID string) (Volume, error) {
|
|||||||
timeTaken := time.Since(startTime).Seconds()
|
timeTaken := time.Since(startTime).Seconds()
|
||||||
recordOpenstackOperationMetric("get_v2_volume", timeTaken, err)
|
recordOpenstackOperationMetric("get_v2_volume", timeTaken, err)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
glog.Errorf("Error occurred getting volume by ID: %s", volumeID)
|
return Volume{}, fmt.Errorf("error occurred getting volume by ID: %s, err: %v", volumeID, err)
|
||||||
return Volume{}, err
|
|
||||||
}
|
}
|
||||||
|
|
||||||
volume := Volume{
|
volume := Volume{
|
||||||
@ -174,10 +171,6 @@ func (volumes *VolumesV1) deleteVolume(volumeID string) error {
|
|||||||
err := volumes_v1.Delete(volumes.blockstorage, volumeID).ExtractErr()
|
err := volumes_v1.Delete(volumes.blockstorage, volumeID).ExtractErr()
|
||||||
timeTaken := time.Since(startTime).Seconds()
|
timeTaken := time.Since(startTime).Seconds()
|
||||||
recordOpenstackOperationMetric("delete_v1_volume", timeTaken, err)
|
recordOpenstackOperationMetric("delete_v1_volume", timeTaken, err)
|
||||||
if err != nil {
|
|
||||||
glog.Errorf("Cannot delete volume %s: %v", volumeID, err)
|
|
||||||
}
|
|
||||||
|
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -186,10 +179,6 @@ func (volumes *VolumesV2) deleteVolume(volumeID string) error {
|
|||||||
err := volumes_v2.Delete(volumes.blockstorage, volumeID).ExtractErr()
|
err := volumes_v2.Delete(volumes.blockstorage, volumeID).ExtractErr()
|
||||||
timeTaken := time.Since(startTime).Seconds()
|
timeTaken := time.Since(startTime).Seconds()
|
||||||
recordOpenstackOperationMetric("delete_v2_volume", timeTaken, err)
|
recordOpenstackOperationMetric("delete_v2_volume", timeTaken, err)
|
||||||
if err != nil {
|
|
||||||
glog.Errorf("Cannot delete volume %s: %v", volumeID, err)
|
|
||||||
}
|
|
||||||
|
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -200,7 +189,6 @@ func (os *OpenStack) OperationPending(diskName string) (bool, string, error) {
|
|||||||
}
|
}
|
||||||
volumeStatus := volume.Status
|
volumeStatus := volume.Status
|
||||||
if volumeStatus == VolumeErrorStatus {
|
if volumeStatus == VolumeErrorStatus {
|
||||||
glog.Errorf("status of volume %s is %s", diskName, volumeStatus)
|
|
||||||
return false, volumeStatus, nil
|
return false, volumeStatus, nil
|
||||||
}
|
}
|
||||||
if volumeStatus == VolumeAvailableStatus || volumeStatus == VolumeInUseStatus || volumeStatus == VolumeDeletedStatus {
|
if volumeStatus == VolumeAvailableStatus || volumeStatus == VolumeInUseStatus || volumeStatus == VolumeDeletedStatus {
|
||||||
@ -226,9 +214,7 @@ func (os *OpenStack) AttachDisk(instanceID, volumeID string) (string, error) {
|
|||||||
glog.V(4).Infof("Disk %s is already attached to instance %s", volumeID, instanceID)
|
glog.V(4).Infof("Disk %s is already attached to instance %s", volumeID, instanceID)
|
||||||
return volume.ID, nil
|
return volume.ID, nil
|
||||||
}
|
}
|
||||||
errmsg := fmt.Sprintf("Disk %s is attached to a different instance (%s)", volumeID, volume.AttachedServerId)
|
return "", fmt.Errorf("disk %s is attached to a different instance (%s)", volumeID, volume.AttachedServerId)
|
||||||
glog.V(2).Infof(errmsg)
|
|
||||||
return "", errors.New(errmsg)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
startTime := time.Now()
|
startTime := time.Now()
|
||||||
@ -239,8 +225,7 @@ func (os *OpenStack) AttachDisk(instanceID, volumeID string) (string, error) {
|
|||||||
timeTaken := time.Since(startTime).Seconds()
|
timeTaken := time.Since(startTime).Seconds()
|
||||||
recordOpenstackOperationMetric("attach_disk", timeTaken, err)
|
recordOpenstackOperationMetric("attach_disk", timeTaken, err)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
glog.Errorf("Failed to attach %s volume to %s compute: %v", volumeID, instanceID, err)
|
return "", fmt.Errorf("failed to attach %s volume to %s compute: %v", volumeID, instanceID, err)
|
||||||
return "", err
|
|
||||||
}
|
}
|
||||||
glog.V(2).Infof("Successfully attached %s volume to %s compute", volumeID, instanceID)
|
glog.V(2).Infof("Successfully attached %s volume to %s compute", volumeID, instanceID)
|
||||||
return volume.ID, nil
|
return volume.ID, nil
|
||||||
@ -259,18 +244,14 @@ func (os *OpenStack) DetachDisk(instanceID, volumeID string) error {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if volume.Status != VolumeInUseStatus {
|
if volume.Status != VolumeInUseStatus {
|
||||||
errmsg := fmt.Sprintf("can not detach volume %s, its status is %s.", volume.Name, volume.Status)
|
return fmt.Errorf("can not detach volume %s, its status is %s", volume.Name, volume.Status)
|
||||||
glog.Errorf(errmsg)
|
|
||||||
return errors.New(errmsg)
|
|
||||||
}
|
}
|
||||||
cClient, err := os.NewComputeV2()
|
cClient, err := os.NewComputeV2()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
if volume.AttachedServerId != instanceID {
|
if volume.AttachedServerId != instanceID {
|
||||||
errMsg := fmt.Sprintf("Disk: %s has no attachments or is not attached to compute: %s", volume.Name, instanceID)
|
return fmt.Errorf("disk: %s has no attachments or is not attached to compute: %s", volume.Name, instanceID)
|
||||||
glog.Errorf(errMsg)
|
|
||||||
return errors.New(errMsg)
|
|
||||||
} else {
|
} else {
|
||||||
startTime := time.Now()
|
startTime := time.Now()
|
||||||
// This is a blocking call and effects kubelet's performance directly.
|
// This is a blocking call and effects kubelet's performance directly.
|
||||||
@ -279,8 +260,7 @@ func (os *OpenStack) DetachDisk(instanceID, volumeID string) error {
|
|||||||
timeTaken := time.Since(startTime).Seconds()
|
timeTaken := time.Since(startTime).Seconds()
|
||||||
recordOpenstackOperationMetric("detach_disk", timeTaken, err)
|
recordOpenstackOperationMetric("detach_disk", timeTaken, err)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
glog.Errorf("Failed to delete volume %s from compute %s attached %v", volume.ID, instanceID, err)
|
return fmt.Errorf("failed to delete volume %s from compute %s attached %v", volume.ID, instanceID, err)
|
||||||
return err
|
|
||||||
}
|
}
|
||||||
glog.V(2).Infof("Successfully detached volume: %s from compute: %s", volume.ID, instanceID)
|
glog.V(2).Infof("Successfully detached volume: %s from compute: %s", volume.ID, instanceID)
|
||||||
}
|
}
|
||||||
@ -291,9 +271,8 @@ func (os *OpenStack) DetachDisk(instanceID, volumeID string) error {
|
|||||||
// getVolume retrieves Volume by its ID.
|
// getVolume retrieves Volume by its ID.
|
||||||
func (os *OpenStack) getVolume(volumeID string) (Volume, error) {
|
func (os *OpenStack) getVolume(volumeID string) (Volume, error) {
|
||||||
volumes, err := os.volumeService("")
|
volumes, err := os.volumeService("")
|
||||||
if err != nil || volumes == nil {
|
if err != nil {
|
||||||
glog.Errorf("Unable to initialize cinder client for region: %s", os.region)
|
return Volume{}, fmt.Errorf("unable to initialize cinder client for region: %s, err: %v", os.region, err)
|
||||||
return Volume{}, err
|
|
||||||
}
|
}
|
||||||
return volumes.getVolume(volumeID)
|
return volumes.getVolume(volumeID)
|
||||||
}
|
}
|
||||||
@ -301,9 +280,8 @@ func (os *OpenStack) getVolume(volumeID string) (Volume, error) {
|
|||||||
// CreateVolume creates a volume of given size (in GiB)
|
// CreateVolume creates a volume of given size (in GiB)
|
||||||
func (os *OpenStack) CreateVolume(name string, size int, vtype, availability string, tags *map[string]string) (string, string, bool, error) {
|
func (os *OpenStack) CreateVolume(name string, size int, vtype, availability string, tags *map[string]string) (string, string, bool, error) {
|
||||||
volumes, err := os.volumeService("")
|
volumes, err := os.volumeService("")
|
||||||
if err != nil || volumes == nil {
|
if err != nil {
|
||||||
glog.Errorf("Unable to initialize cinder client for region: %s", os.region)
|
return "", "", os.bsOpts.IgnoreVolumeAZ, fmt.Errorf("unable to initialize cinder client for region: %s, err: %v", os.region, err)
|
||||||
return "", "", os.bsOpts.IgnoreVolumeAZ, err
|
|
||||||
}
|
}
|
||||||
|
|
||||||
opts := VolumeCreateOpts{
|
opts := VolumeCreateOpts{
|
||||||
@ -319,8 +297,7 @@ func (os *OpenStack) CreateVolume(name string, size int, vtype, availability str
|
|||||||
volumeID, volumeAZ, err := volumes.createVolume(opts)
|
volumeID, volumeAZ, err := volumes.createVolume(opts)
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
glog.Errorf("Failed to create a %d GB volume: %v", size, err)
|
return "", "", os.bsOpts.IgnoreVolumeAZ, fmt.Errorf("failed to create a %d GB volume: %v", size, err)
|
||||||
return "", "", os.bsOpts.IgnoreVolumeAZ, err
|
|
||||||
}
|
}
|
||||||
|
|
||||||
glog.Infof("Created volume %v in Availability Zone: %v Ignore volume AZ: %v", volumeID, volumeAZ, os.bsOpts.IgnoreVolumeAZ)
|
glog.Infof("Created volume %v in Availability Zone: %v Ignore volume AZ: %v", volumeID, volumeAZ, os.bsOpts.IgnoreVolumeAZ)
|
||||||
@ -365,15 +342,11 @@ func (os *OpenStack) DeleteVolume(volumeID string) error {
|
|||||||
}
|
}
|
||||||
|
|
||||||
volumes, err := os.volumeService("")
|
volumes, err := os.volumeService("")
|
||||||
if err != nil || volumes == nil {
|
if err != nil {
|
||||||
glog.Errorf("Unable to initialize cinder client for region: %s", os.region)
|
return fmt.Errorf("unable to initialize cinder client for region: %s, err: %v", os.region, err)
|
||||||
return err
|
|
||||||
}
|
}
|
||||||
|
|
||||||
err = volumes.deleteVolume(volumeID)
|
err = volumes.deleteVolume(volumeID)
|
||||||
if err != nil {
|
|
||||||
glog.Errorf("Cannot delete volume %s: %v", volumeID, err)
|
|
||||||
}
|
|
||||||
return err
|
return err
|
||||||
|
|
||||||
}
|
}
|
||||||
@ -387,9 +360,7 @@ func (os *OpenStack) GetAttachmentDiskPath(instanceID, volumeID string) (string,
|
|||||||
return "", err
|
return "", err
|
||||||
}
|
}
|
||||||
if volume.Status != VolumeInUseStatus {
|
if volume.Status != VolumeInUseStatus {
|
||||||
errmsg := fmt.Sprintf("can not get device path of volume %s, its status is %s.", volume.Name, volume.Status)
|
return "", fmt.Errorf("can not get device path of volume %s, its status is %s ", volume.Name, volume.Status)
|
||||||
glog.Errorf(errmsg)
|
|
||||||
return "", errors.New(errmsg)
|
|
||||||
}
|
}
|
||||||
if volume.AttachedServerId != "" {
|
if volume.AttachedServerId != "" {
|
||||||
if instanceID == volume.AttachedServerId {
|
if instanceID == volume.AttachedServerId {
|
||||||
@ -397,12 +368,10 @@ func (os *OpenStack) GetAttachmentDiskPath(instanceID, volumeID string) (string,
|
|||||||
// see http://developer.openstack.org/api-ref-blockstorage-v1.html
|
// see http://developer.openstack.org/api-ref-blockstorage-v1.html
|
||||||
return volume.AttachedDevice, nil
|
return volume.AttachedDevice, nil
|
||||||
} else {
|
} else {
|
||||||
errMsg := fmt.Sprintf("Disk %q is attached to a different compute: %q, should be detached before proceeding", volumeID, volume.AttachedServerId)
|
return "", fmt.Errorf("disk %q is attached to a different compute: %q, should be detached before proceeding", volumeID, volume.AttachedServerId)
|
||||||
glog.Errorf(errMsg)
|
|
||||||
return "", errors.New(errMsg)
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return "", fmt.Errorf("volume %s has no ServerId.", volumeID)
|
return "", fmt.Errorf("volume %s has no ServerId", volumeID)
|
||||||
}
|
}
|
||||||
|
|
||||||
// DiskIsAttached queries if a volume is attached to a compute instance
|
// DiskIsAttached queries if a volume is attached to a compute instance
|
||||||
|
Loading…
Reference in New Issue
Block a user