Commit 147b6911 authored by Jerzy Szczepkowski's avatar Jerzy Szczepkowski

Merge pull request #17636 from kubernetes/revert-17276-fixErrorCreatingPD

Revert "Refactor GCE wrapper library to allow execution from E2E test suite"
parents 6fd98606 8a922e22
...@@ -62,12 +62,13 @@ const ( ...@@ -62,12 +62,13 @@ const (
// GCECloud is an implementation of Interface, TCPLoadBalancer and Instances for Google Compute Engine. // GCECloud is an implementation of Interface, TCPLoadBalancer and Instances for Google Compute Engine.
type GCECloud struct { type GCECloud struct {
service *compute.Service service *compute.Service
containerService *container.Service containerService *container.Service
projectID string projectID string
zone string zone string
networkURL string instanceID string
useMetadataServer bool externalID string
networkURL string
} }
type Config struct { type Config struct {
...@@ -100,7 +101,7 @@ func getProjectAndZone() (string, string, error) { ...@@ -100,7 +101,7 @@ func getProjectAndZone() (string, string, error) {
return projectID, zone, nil return projectID, zone, nil
} }
func getInstanceIDViaMetadata() (string, error) { func getInstanceID() (string, error) {
result, err := metadata.Get("instance/hostname") result, err := metadata.Get("instance/hostname")
if err != nil { if err != nil {
return "", err return "", err
...@@ -112,7 +113,7 @@ func getInstanceIDViaMetadata() (string, error) { ...@@ -112,7 +113,7 @@ func getInstanceIDViaMetadata() (string, error) {
return parts[0], nil return parts[0], nil
} }
func getCurrentExternalIDViaMetadata() (string, error) { func getCurrentExternalID() (string, error) {
externalID, err := metadata.Get("instance/id") externalID, err := metadata.Get("instance/id")
if err != nil { if err != nil {
return "", fmt.Errorf("couldn't get external ID: %v", err) return "", fmt.Errorf("couldn't get external ID: %v", err)
...@@ -120,7 +121,7 @@ func getCurrentExternalIDViaMetadata() (string, error) { ...@@ -120,7 +121,7 @@ func getCurrentExternalIDViaMetadata() (string, error) {
return externalID, nil return externalID, nil
} }
func getNetworkNameViaMetadata() (string, error) { func getNetworkName() (string, error) {
result, err := metadata.Get("instance/network-interfaces/0/network") result, err := metadata.Get("instance/network-interfaces/0/network")
if err != nil { if err != nil {
return "", err return "", err
...@@ -132,32 +133,28 @@ func getNetworkNameViaMetadata() (string, error) { ...@@ -132,32 +133,28 @@ func getNetworkNameViaMetadata() (string, error) {
return parts[3], nil return parts[3], nil
} }
func getNetworkNameViaAPICall(svc *compute.Service, projectID string) (string, error) {
networkList, err := svc.Networks.List(projectID).Do()
if err != nil {
return "", err
}
if networkList == nil || len(networkList.Items) <= 0 {
return "", fmt.Errorf("GCE Network List call returned no networks for project %q.", projectID)
}
return networkList.Items[0].Name, nil
}
// newGCECloud creates a new instance of GCECloud. // newGCECloud creates a new instance of GCECloud.
func newGCECloud(config io.Reader) (*GCECloud, error) { func newGCECloud(config io.Reader) (*GCECloud, error) {
projectID, zone, err := getProjectAndZone() projectID, zone, err := getProjectAndZone()
if err != nil { if err != nil {
return nil, err return nil, err
} }
// TODO: if we want to use this on a machine that doesn't have the http://metadata server
networkName, err := getNetworkNameViaMetadata() // e.g. on a user's machine (not VM) somewhere, we need to have an alternative for
// instance id lookup.
instanceID, err := getInstanceID()
if err != nil {
return nil, err
}
externalID, err := getCurrentExternalID()
if err != nil {
return nil, err
}
networkName, err := getNetworkName()
if err != nil { if err != nil {
return nil, err return nil, err
} }
networkURL := gceNetworkURL(projectID, networkName) networkURL := gceNetworkURL(projectID, networkName)
tokenSource := google.ComputeTokenSource("") tokenSource := google.ComputeTokenSource("")
if config != nil { if config != nil {
var cfg Config var cfg Config
...@@ -179,51 +176,23 @@ func newGCECloud(config io.Reader) (*GCECloud, error) { ...@@ -179,51 +176,23 @@ func newGCECloud(config io.Reader) (*GCECloud, error) {
tokenSource = newAltTokenSource(cfg.Global.TokenURL, cfg.Global.TokenBody) tokenSource = newAltTokenSource(cfg.Global.TokenURL, cfg.Global.TokenBody)
} }
} }
return CreateGCECloud(projectID, zone, networkURL, tokenSource, true /* useMetadataServer */)
}
// Creates a GCECloud object using the specified parameters.
// If no networkUrl is specified, loads networkName via rest call.
// If no tokenSource is specified, uses oauth2.DefaultTokenSource.
func CreateGCECloud(projectID, zone, networkURL string, tokenSource oauth2.TokenSource, useMetadataServer bool) (*GCECloud, error) {
if tokenSource == nil {
var err error
tokenSource, err = google.DefaultTokenSource(
oauth2.NoContext,
compute.CloudPlatformScope,
compute.ComputeScope)
if err != nil {
return nil, err
}
}
client := oauth2.NewClient(oauth2.NoContext, tokenSource) client := oauth2.NewClient(oauth2.NoContext, tokenSource)
svc, err := compute.New(client) svc, err := compute.New(client)
if err != nil { if err != nil {
return nil, err return nil, err
} }
containerSvc, err := container.New(client) containerSvc, err := container.New(client)
if err != nil { if err != nil {
return nil, err return nil, err
} }
if networkURL == "" {
networkName, err := getNetworkNameViaAPICall(svc, projectID)
if err != nil {
return nil, err
}
networkURL = gceNetworkURL(projectID, networkName)
}
return &GCECloud{ return &GCECloud{
service: svc, service: svc,
containerService: containerSvc, containerService: containerSvc,
projectID: projectID, projectID: projectID,
zone: zone, zone: zone,
networkURL: networkURL, instanceID: instanceID,
useMetadataServer: useMetadataServer, externalID: externalID,
networkURL: networkURL,
}, nil }, nil
} }
...@@ -1399,31 +1368,16 @@ func (gce *GCECloud) NodeAddresses(_ string) ([]api.NodeAddress, error) { ...@@ -1399,31 +1368,16 @@ func (gce *GCECloud) NodeAddresses(_ string) ([]api.NodeAddress, error) {
}, nil }, nil
} }
// isCurrentInstance uses metadata server to check if specified instanceID matches current machine's instanceID func (gce *GCECloud) isCurrentInstance(instance string) bool {
func (gce *GCECloud) isCurrentInstance(instanceID string) bool { return gce.instanceID == canonicalizeInstanceName(instance)
currentInstanceID, err := getInstanceIDViaMetadata()
if err != nil {
// Log and swallow error
glog.Errorf("Failed to fetch instanceID via Metadata: %v", err)
return false
}
return currentInstanceID == canonicalizeInstanceName(instanceID)
} }
// ExternalID returns the cloud provider ID of the specified instance (deprecated). // ExternalID returns the cloud provider ID of the specified instance (deprecated).
func (gce *GCECloud) ExternalID(instance string) (string, error) { func (gce *GCECloud) ExternalID(instance string) (string, error) {
if gce.useMetadataServer { // if we are asking about the current instance, just go to metadata
// Use metadata, if possible, to fetch ID. See issue #12000 if gce.isCurrentInstance(instance) {
if gce.isCurrentInstance(instance) { return gce.externalID, nil
externalInstanceID, err := getCurrentExternalIDViaMetadata()
if err == nil {
return externalInstanceID, nil
}
}
} }
// Fallback to GCE API call if metadata server fails to retrieve ID
inst, err := gce.getInstanceByName(instance) inst, err := gce.getInstanceByName(instance)
if err != nil { if err != nil {
return "", err return "", err
...@@ -1540,29 +1494,7 @@ func (gce *GCECloud) GetZone() (cloudprovider.Zone, error) { ...@@ -1540,29 +1494,7 @@ func (gce *GCECloud) GetZone() (cloudprovider.Zone, error) {
}, nil }, nil
} }
func (gce *GCECloud) CreateDisk(name string, sizeGb int64) error { func (gce *GCECloud) AttachDisk(diskName string, readOnly bool) error {
diskToCreate := &compute.Disk{
Name: name,
SizeGb: sizeGb,
}
createOp, err := gce.service.Disks.Insert(gce.projectID, gce.zone, diskToCreate).Do()
if err != nil {
return err
}
return gce.waitForZoneOp(createOp)
}
func (gce *GCECloud) DeleteDisk(diskToDelete string) error {
deleteOp, err := gce.service.Disks.Delete(gce.projectID, gce.zone, diskToDelete).Do()
if err != nil {
return err
}
return gce.waitForZoneOp(deleteOp)
}
func (gce *GCECloud) AttachDisk(diskName, instanceID string, readOnly bool) error {
disk, err := gce.getDisk(diskName) disk, err := gce.getDisk(diskName)
if err != nil { if err != nil {
return err return err
...@@ -1573,7 +1505,7 @@ func (gce *GCECloud) AttachDisk(diskName, instanceID string, readOnly bool) erro ...@@ -1573,7 +1505,7 @@ func (gce *GCECloud) AttachDisk(diskName, instanceID string, readOnly bool) erro
} }
attachedDisk := gce.convertDiskToAttachedDisk(disk, readWrite) attachedDisk := gce.convertDiskToAttachedDisk(disk, readWrite)
attachOp, err := gce.service.Instances.AttachDisk(gce.projectID, gce.zone, instanceID, attachedDisk).Do() attachOp, err := gce.service.Instances.AttachDisk(gce.projectID, gce.zone, gce.instanceID, attachedDisk).Do()
if err != nil { if err != nil {
return err return err
} }
...@@ -1581,8 +1513,8 @@ func (gce *GCECloud) AttachDisk(diskName, instanceID string, readOnly bool) erro ...@@ -1581,8 +1513,8 @@ func (gce *GCECloud) AttachDisk(diskName, instanceID string, readOnly bool) erro
return gce.waitForZoneOp(attachOp) return gce.waitForZoneOp(attachOp)
} }
func (gce *GCECloud) DetachDisk(devicePath, instanceID string) error { func (gce *GCECloud) DetachDisk(devicePath string) error {
detachOp, err := gce.service.Instances.DetachDisk(gce.projectID, gce.zone, instanceID, devicePath).Do() detachOp, err := gce.service.Instances.DetachDisk(gce.projectID, gce.zone, gce.instanceID, devicePath).Do()
if err != nil { if err != nil {
return err return err
} }
...@@ -1590,22 +1522,6 @@ func (gce *GCECloud) DetachDisk(devicePath, instanceID string) error { ...@@ -1590,22 +1522,6 @@ func (gce *GCECloud) DetachDisk(devicePath, instanceID string) error {
return gce.waitForZoneOp(detachOp) return gce.waitForZoneOp(detachOp)
} }
func (gce *GCECloud) DiskIsAttached(diskName, instanceID string) (bool, error) {
instance, err := gce.service.Instances.Get(gce.projectID, gce.zone, instanceID).Do()
if err != nil {
return false, err
}
for _, disk := range instance.Disks {
if disk.DeviceName == diskName {
// Disk is still attached to node
return true, nil
}
}
return false, nil
}
func (gce *GCECloud) getDisk(diskName string) (*compute.Disk, error) { func (gce *GCECloud) getDisk(diskName string) (*compute.Disk, error) {
return gce.service.Disks.Get(gce.projectID, gce.zone, diskName).Do() return gce.service.Disks.Get(gce.projectID, gce.zone, diskName).Do()
} }
......
...@@ -294,7 +294,3 @@ func (f *PersistentVolumeRecycler) GetMounter() mount.Interface { ...@@ -294,7 +294,3 @@ func (f *PersistentVolumeRecycler) GetMounter() mount.Interface {
func (f *PersistentVolumeRecycler) GetWriter() ioutil.Writer { func (f *PersistentVolumeRecycler) GetWriter() ioutil.Writer {
return nil return nil
} }
func (f *PersistentVolumeRecycler) GetHostName() string {
return ""
}
...@@ -93,11 +93,6 @@ func (vh *volumeHost) GetWriter() io.Writer { ...@@ -93,11 +93,6 @@ func (vh *volumeHost) GetWriter() io.Writer {
return vh.kubelet.writer return vh.kubelet.writer
} }
// Returns the hostname of the host kubelet is running on
func (vh *volumeHost) GetHostName() string {
return vh.kubelet.hostname
}
func (kl *Kubelet) newVolumeBuilderFromPlugins(spec *volume.Spec, pod *api.Pod, opts volume.VolumeOptions) (volume.Builder, error) { func (kl *Kubelet) newVolumeBuilderFromPlugins(spec *volume.Spec, pod *api.Pod, opts volume.VolumeOptions) (volume.Builder, error) {
plugin, err := kl.volumePluginMgr.FindPluginBySpec(spec) plugin, err := kl.volumePluginMgr.FindPluginBySpec(spec)
if err != nil { if err != nil {
......
...@@ -132,7 +132,7 @@ func attachDiskAndVerify(b *gcePersistentDiskBuilder, sdBeforeSet sets.String) ( ...@@ -132,7 +132,7 @@ func attachDiskAndVerify(b *gcePersistentDiskBuilder, sdBeforeSet sets.String) (
glog.Warningf("Retrying attach for GCE PD %q (retry count=%v).", b.pdName, numRetries) glog.Warningf("Retrying attach for GCE PD %q (retry count=%v).", b.pdName, numRetries)
} }
if err := gceCloud.AttachDisk(b.pdName, b.plugin.host.GetHostName(), b.readOnly); err != nil { if err := gceCloud.AttachDisk(b.pdName, b.readOnly); err != nil {
glog.Errorf("Error attaching PD %q: %v", b.pdName, err) glog.Errorf("Error attaching PD %q: %v", b.pdName, err)
time.Sleep(errorSleepDuration) time.Sleep(errorSleepDuration)
continue continue
...@@ -206,7 +206,7 @@ func detachDiskAndVerify(c *gcePersistentDiskCleaner) { ...@@ -206,7 +206,7 @@ func detachDiskAndVerify(c *gcePersistentDiskCleaner) {
glog.Warningf("Retrying detach for GCE PD %q (retry count=%v).", c.pdName, numRetries) glog.Warningf("Retrying detach for GCE PD %q (retry count=%v).", c.pdName, numRetries)
} }
if err := gceCloud.DetachDisk(c.pdName, c.plugin.host.GetHostName()); err != nil { if err := gceCloud.DetachDisk(c.pdName); err != nil {
glog.Errorf("Error detaching PD %q: %v", c.pdName, err) glog.Errorf("Error detaching PD %q: %v", c.pdName, err)
time.Sleep(errorSleepDuration) time.Sleep(errorSleepDuration)
continue continue
......
...@@ -156,9 +156,6 @@ type VolumeHost interface { ...@@ -156,9 +156,6 @@ type VolumeHost interface {
// Get writer interface for writing data to disk. // Get writer interface for writing data to disk.
GetWriter() io.Writer GetWriter() io.Writer
// Returns the hostname of the host kubelet is running on
GetHostName() string
} }
// VolumePluginMgr tracks registered plugins. // VolumePluginMgr tracks registered plugins.
......
...@@ -92,11 +92,6 @@ func (f *fakeVolumeHost) NewWrapperCleaner(spec *Spec, podUID types.UID) (Cleane ...@@ -92,11 +92,6 @@ func (f *fakeVolumeHost) NewWrapperCleaner(spec *Spec, podUID types.UID) (Cleane
return plug.NewCleaner(spec.Name(), podUID) return plug.NewCleaner(spec.Name(), podUID)
} }
// Returns the hostname of the host kubelet is running on
func (f *fakeVolumeHost) GetHostName() string {
return "fakeHostName"
}
func ProbeVolumePlugins(config VolumeConfig) []VolumePlugin { func ProbeVolumePlugins(config VolumeConfig) []VolumePlugin {
if _, ok := config.OtherAttributes["fake-property"]; ok { if _, ok := config.OtherAttributes["fake-property"]; ok {
return []VolumePlugin{ return []VolumePlugin{
......
...@@ -33,7 +33,6 @@ import ( ...@@ -33,7 +33,6 @@ import (
"k8s.io/kubernetes/pkg/api" "k8s.io/kubernetes/pkg/api"
"k8s.io/kubernetes/pkg/client/unversioned/clientcmd" "k8s.io/kubernetes/pkg/client/unversioned/clientcmd"
"k8s.io/kubernetes/pkg/cloudprovider" "k8s.io/kubernetes/pkg/cloudprovider"
gcecloud "k8s.io/kubernetes/pkg/cloudprovider/providers/gce"
"k8s.io/kubernetes/pkg/util" "k8s.io/kubernetes/pkg/util"
) )
...@@ -102,16 +101,6 @@ func TestE2E(t *testing.T) { ...@@ -102,16 +101,6 @@ func TestE2E(t *testing.T) {
glog.Info("The --provider flag is not set. Treating as a conformance test. Some tests may not be run.") glog.Info("The --provider flag is not set. Treating as a conformance test. Some tests may not be run.")
} }
if testContext.Provider == "gce" || testContext.Provider == "gke" {
var err error
Logf("Fetching cloud provider for %q\r\n", testContext.Provider)
cloudConfig.Provider, err = gcecloud.CreateGCECloud(testContext.CloudConfig.ProjectID, testContext.CloudConfig.Zone, "" /* networkUrl */, nil /* tokenSource */, false /* useMetadataServer */)
if err != nil {
glog.Fatal("Error building GCE provider: ", err)
}
}
if testContext.Provider == "aws" { if testContext.Provider == "aws" {
awsConfig := "[Global]\n" awsConfig := "[Global]\n"
if cloudConfig.Zone == "" { if cloudConfig.Zone == "" {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment