mirror of https://github.com/kubernetes/kops.git
Merge pull request #3292 from chrislovecnm/gce-change-to-interface
Automatic merge from submit-queue Implementing GCE as an interface - modelling aws cloud provider GCE and other cloud providers are structs instead of an interface. AWS cloud provider implements an interface. This PR refactors `GCECloud` as an interface, and creates `gceCloudImplementation`. - [x] Need to e2e test
This commit is contained in:
commit
1cba2a2346
|
@ -39,7 +39,7 @@ func (s *cloudDiscoveryStatusStore) GetApiIngressStatus(cluster *kops.Cluster) (
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
if gceCloud, ok := cloud.(*gce.GCECloud); ok {
|
if gceCloud, ok := cloud.(gce.GCECloud); ok {
|
||||||
return gceCloud.GetApiIngressStatus(cluster)
|
return gceCloud.GetApiIngressStatus(cluster)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -45,9 +45,9 @@ const (
|
||||||
)
|
)
|
||||||
|
|
||||||
func (c *ClusterResources) listResourcesGCE() (map[string]*ResourceTracker, error) {
|
func (c *ClusterResources) listResourcesGCE() (map[string]*ResourceTracker, error) {
|
||||||
gceCloud := c.Cloud.(*gce.GCECloud)
|
gceCloud := c.Cloud.(gce.GCECloud)
|
||||||
if c.Region == "" {
|
if c.Region == "" {
|
||||||
c.Region = gceCloud.Region
|
c.Region = gceCloud.Region()
|
||||||
}
|
}
|
||||||
|
|
||||||
resources := make(map[string]*ResourceTracker)
|
resources := make(map[string]*ResourceTracker)
|
||||||
|
@ -60,7 +60,7 @@ func (c *ClusterResources) listResourcesGCE() (map[string]*ResourceTracker, erro
|
||||||
|
|
||||||
{
|
{
|
||||||
// TODO: Only zones in api.Cluster object, if we have one?
|
// TODO: Only zones in api.Cluster object, if we have one?
|
||||||
gceZones, err := d.gceCloud.Compute.Zones.List(d.gceCloud.Project).Do()
|
gceZones, err := d.gceCloud.Compute().Zones.List(d.gceCloud.Project()).Do()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("error listing zones: %v", err)
|
return nil, fmt.Errorf("error listing zones: %v", err)
|
||||||
}
|
}
|
||||||
|
@ -123,7 +123,7 @@ func (c *ClusterResources) listResourcesGCE() (map[string]*ResourceTracker, erro
|
||||||
|
|
||||||
type clusterDiscoveryGCE struct {
|
type clusterDiscoveryGCE struct {
|
||||||
cloud fi.Cloud
|
cloud fi.Cloud
|
||||||
gceCloud *gce.GCECloud
|
gceCloud gce.GCECloud
|
||||||
clusterName string
|
clusterName string
|
||||||
|
|
||||||
instanceTemplates []*compute.InstanceTemplate
|
instanceTemplates []*compute.InstanceTemplate
|
||||||
|
@ -147,7 +147,7 @@ func (d *clusterDiscoveryGCE) findInstanceTemplates() ([]*compute.InstanceTempla
|
||||||
|
|
||||||
ctx := context.Background()
|
ctx := context.Background()
|
||||||
|
|
||||||
err := c.Compute.InstanceTemplates.List(c.Project).Pages(ctx, func(page *compute.InstanceTemplateList) error {
|
err := c.Compute().InstanceTemplates.List(c.Project()).Pages(ctx, func(page *compute.InstanceTemplateList) error {
|
||||||
for _, t := range page.Items {
|
for _, t := range page.Items {
|
||||||
match := false
|
match := false
|
||||||
for _, item := range t.Properties.Metadata.Items {
|
for _, item := range t.Properties.Metadata.Items {
|
||||||
|
@ -202,7 +202,7 @@ func (d *clusterDiscoveryGCE) listGCEInstanceTemplates() ([]*ResourceTracker, er
|
||||||
}
|
}
|
||||||
|
|
||||||
func deleteGCEInstanceTemplate(cloud fi.Cloud, r *ResourceTracker) error {
|
func deleteGCEInstanceTemplate(cloud fi.Cloud, r *ResourceTracker) error {
|
||||||
c := cloud.(*gce.GCECloud)
|
c := cloud.(gce.GCECloud)
|
||||||
t := r.obj.(*compute.InstanceTemplate)
|
t := r.obj.(*compute.InstanceTemplate)
|
||||||
|
|
||||||
glog.V(2).Infof("Deleting GCE InstanceTemplate %s", t.SelfLink)
|
glog.V(2).Infof("Deleting GCE InstanceTemplate %s", t.SelfLink)
|
||||||
|
@ -211,7 +211,7 @@ func deleteGCEInstanceTemplate(cloud fi.Cloud, r *ResourceTracker) error {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
op, err := c.Compute.InstanceTemplates.Delete(u.Project, u.Name).Do()
|
op, err := c.Compute().InstanceTemplates.Delete(u.Project, u.Name).Do()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
if gce.IsNotFound(err) {
|
if gce.IsNotFound(err) {
|
||||||
glog.Infof("instancetemplate not found, assuming deleted: %q", t.SelfLink)
|
glog.Infof("instancetemplate not found, assuming deleted: %q", t.SelfLink)
|
||||||
|
@ -225,7 +225,7 @@ func deleteGCEInstanceTemplate(cloud fi.Cloud, r *ResourceTracker) error {
|
||||||
|
|
||||||
func (d *clusterDiscoveryGCE) listInstanceGroupManagersAndInstances() ([]*ResourceTracker, error) {
|
func (d *clusterDiscoveryGCE) listInstanceGroupManagersAndInstances() ([]*ResourceTracker, error) {
|
||||||
c := d.gceCloud
|
c := d.gceCloud
|
||||||
project := c.Project
|
project := c.Project()
|
||||||
|
|
||||||
var trackers []*ResourceTracker
|
var trackers []*ResourceTracker
|
||||||
|
|
||||||
|
@ -243,7 +243,7 @@ func (d *clusterDiscoveryGCE) listInstanceGroupManagersAndInstances() ([]*Resour
|
||||||
ctx := context.Background()
|
ctx := context.Background()
|
||||||
|
|
||||||
for _, zoneName := range d.zones {
|
for _, zoneName := range d.zones {
|
||||||
err := c.Compute.InstanceGroupManagers.List(project, zoneName).Pages(ctx, func(page *compute.InstanceGroupManagerList) error {
|
err := c.Compute().InstanceGroupManagers.List(project, zoneName).Pages(ctx, func(page *compute.InstanceGroupManagerList) error {
|
||||||
for _, mig := range page.Items {
|
for _, mig := range page.Items {
|
||||||
instanceTemplate := instanceTemplates[mig.InstanceTemplate]
|
instanceTemplate := instanceTemplates[mig.InstanceTemplate]
|
||||||
if instanceTemplate == nil {
|
if instanceTemplate == nil {
|
||||||
|
@ -282,7 +282,7 @@ func (d *clusterDiscoveryGCE) listInstanceGroupManagersAndInstances() ([]*Resour
|
||||||
}
|
}
|
||||||
|
|
||||||
func deleteInstanceGroupManager(cloud fi.Cloud, r *ResourceTracker) error {
|
func deleteInstanceGroupManager(cloud fi.Cloud, r *ResourceTracker) error {
|
||||||
c := cloud.(*gce.GCECloud)
|
c := cloud.(gce.GCECloud)
|
||||||
t := r.obj.(*compute.InstanceGroupManager)
|
t := r.obj.(*compute.InstanceGroupManager)
|
||||||
|
|
||||||
glog.V(2).Infof("Deleting GCE InstanceGroupManager %s", t.SelfLink)
|
glog.V(2).Infof("Deleting GCE InstanceGroupManager %s", t.SelfLink)
|
||||||
|
@ -293,7 +293,7 @@ func deleteInstanceGroupManager(cloud fi.Cloud, r *ResourceTracker) error {
|
||||||
|
|
||||||
//glog.Infof("MIG: %s", fi.DebugAsJsonString(t))
|
//glog.Infof("MIG: %s", fi.DebugAsJsonString(t))
|
||||||
|
|
||||||
op, err := c.Compute.InstanceGroupManagers.Delete(u.Project, u.Zone, u.Name).Do()
|
op, err := c.Compute().InstanceGroupManagers.Delete(u.Project, u.Zone, u.Name).Do()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
if gce.IsNotFound(err) {
|
if gce.IsNotFound(err) {
|
||||||
glog.Infof("InstanceGroupManager not found, assuming deleted: %q", t.SelfLink)
|
glog.Infof("InstanceGroupManager not found, assuming deleted: %q", t.SelfLink)
|
||||||
|
@ -307,14 +307,14 @@ func deleteInstanceGroupManager(cloud fi.Cloud, r *ResourceTracker) error {
|
||||||
|
|
||||||
func (d *clusterDiscoveryGCE) listManagedInstances(igm *compute.InstanceGroupManager) ([]*ResourceTracker, error) {
|
func (d *clusterDiscoveryGCE) listManagedInstances(igm *compute.InstanceGroupManager) ([]*ResourceTracker, error) {
|
||||||
c := d.gceCloud
|
c := d.gceCloud
|
||||||
project := c.Project
|
project := c.Project()
|
||||||
|
|
||||||
var trackers []*ResourceTracker
|
var trackers []*ResourceTracker
|
||||||
|
|
||||||
zoneName := gce.LastComponent(igm.Zone)
|
zoneName := gce.LastComponent(igm.Zone)
|
||||||
|
|
||||||
// This call is not paginated
|
// This call is not paginated
|
||||||
instances, err := c.Compute.InstanceGroupManagers.ListManagedInstances(project, zoneName, igm.Name).Do()
|
instances, err := c.Compute().InstanceGroupManagers.ListManagedInstances(project, zoneName, igm.Name).Do()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("error listing ManagedInstances in %s: %v", igm.Name, err)
|
return nil, fmt.Errorf("error listing ManagedInstances in %s: %v", igm.Name, err)
|
||||||
}
|
}
|
||||||
|
@ -351,7 +351,7 @@ func (d *clusterDiscoveryGCE) findGCEDisks() ([]*compute.Disk, error) {
|
||||||
|
|
||||||
// TODO: Push down tag filter?
|
// TODO: Push down tag filter?
|
||||||
|
|
||||||
err := c.Compute.Disks.AggregatedList(c.Project).Pages(ctx, func(page *compute.DiskAggregatedList) error {
|
err := c.Compute().Disks.AggregatedList(c.Project()).Pages(ctx, func(page *compute.DiskAggregatedList) error {
|
||||||
for _, list := range page.Items {
|
for _, list := range page.Items {
|
||||||
for _, d := range list.Disks {
|
for _, d := range list.Disks {
|
||||||
match := false
|
match := false
|
||||||
|
@ -411,7 +411,7 @@ func (d *clusterDiscoveryGCE) listGCEDisks() ([]*ResourceTracker, error) {
|
||||||
}
|
}
|
||||||
|
|
||||||
func deleteGCEDisk(cloud fi.Cloud, r *ResourceTracker) error {
|
func deleteGCEDisk(cloud fi.Cloud, r *ResourceTracker) error {
|
||||||
c := cloud.(*gce.GCECloud)
|
c := cloud.(gce.GCECloud)
|
||||||
t := r.obj.(*compute.Disk)
|
t := r.obj.(*compute.Disk)
|
||||||
|
|
||||||
glog.V(2).Infof("Deleting GCE Disk %s", t.SelfLink)
|
glog.V(2).Infof("Deleting GCE Disk %s", t.SelfLink)
|
||||||
|
@ -420,7 +420,7 @@ func deleteGCEDisk(cloud fi.Cloud, r *ResourceTracker) error {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
op, err := c.Compute.Disks.Delete(u.Project, u.Zone, u.Name).Do()
|
op, err := c.Compute().Disks.Delete(u.Project, u.Zone, u.Name).Do()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
if gce.IsNotFound(err) {
|
if gce.IsNotFound(err) {
|
||||||
glog.Infof("disk not found, assuming deleted: %q", t.SelfLink)
|
glog.Infof("disk not found, assuming deleted: %q", t.SelfLink)
|
||||||
|
@ -439,7 +439,7 @@ func (d *clusterDiscoveryGCE) listTargetPools() ([]*ResourceTracker, error) {
|
||||||
|
|
||||||
ctx := context.Background()
|
ctx := context.Background()
|
||||||
|
|
||||||
err := c.Compute.TargetPools.List(c.Project, c.Region).Pages(ctx, func(page *compute.TargetPoolList) error {
|
err := c.Compute().TargetPools.List(c.Project(), c.Region()).Pages(ctx, func(page *compute.TargetPoolList) error {
|
||||||
for _, tp := range page.Items {
|
for _, tp := range page.Items {
|
||||||
if !d.matchesClusterName(tp.Name) {
|
if !d.matchesClusterName(tp.Name) {
|
||||||
continue
|
continue
|
||||||
|
@ -467,7 +467,7 @@ func (d *clusterDiscoveryGCE) listTargetPools() ([]*ResourceTracker, error) {
|
||||||
}
|
}
|
||||||
|
|
||||||
func deleteTargetPool(cloud fi.Cloud, r *ResourceTracker) error {
|
func deleteTargetPool(cloud fi.Cloud, r *ResourceTracker) error {
|
||||||
c := cloud.(*gce.GCECloud)
|
c := cloud.(gce.GCECloud)
|
||||||
t := r.obj.(*compute.TargetPool)
|
t := r.obj.(*compute.TargetPool)
|
||||||
|
|
||||||
glog.V(2).Infof("Deleting GCE TargetPool %s", t.SelfLink)
|
glog.V(2).Infof("Deleting GCE TargetPool %s", t.SelfLink)
|
||||||
|
@ -478,7 +478,7 @@ func deleteTargetPool(cloud fi.Cloud, r *ResourceTracker) error {
|
||||||
|
|
||||||
glog.Infof("TargetPool: %s", fi.DebugAsJsonString(t))
|
glog.Infof("TargetPool: %s", fi.DebugAsJsonString(t))
|
||||||
|
|
||||||
op, err := c.Compute.TargetPools.Delete(u.Project, u.Region, u.Name).Do()
|
op, err := c.Compute().TargetPools.Delete(u.Project, u.Region, u.Name).Do()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
if gce.IsNotFound(err) {
|
if gce.IsNotFound(err) {
|
||||||
glog.Infof("TargetPool not found, assuming deleted: %q", t.SelfLink)
|
glog.Infof("TargetPool not found, assuming deleted: %q", t.SelfLink)
|
||||||
|
@ -497,7 +497,7 @@ func (d *clusterDiscoveryGCE) listForwardingRules() ([]*ResourceTracker, error)
|
||||||
|
|
||||||
ctx := context.Background()
|
ctx := context.Background()
|
||||||
|
|
||||||
err := c.Compute.ForwardingRules.List(c.Project, c.Region).Pages(ctx, func(page *compute.ForwardingRuleList) error {
|
err := c.Compute().ForwardingRules.List(c.Project(), c.Region()).Pages(ctx, func(page *compute.ForwardingRuleList) error {
|
||||||
for _, fr := range page.Items {
|
for _, fr := range page.Items {
|
||||||
if !d.matchesClusterName(fr.Name) {
|
if !d.matchesClusterName(fr.Name) {
|
||||||
continue
|
continue
|
||||||
|
@ -532,7 +532,7 @@ func (d *clusterDiscoveryGCE) listForwardingRules() ([]*ResourceTracker, error)
|
||||||
}
|
}
|
||||||
|
|
||||||
func deleteForwardingRule(cloud fi.Cloud, r *ResourceTracker) error {
|
func deleteForwardingRule(cloud fi.Cloud, r *ResourceTracker) error {
|
||||||
c := cloud.(*gce.GCECloud)
|
c := cloud.(gce.GCECloud)
|
||||||
t := r.obj.(*compute.ForwardingRule)
|
t := r.obj.(*compute.ForwardingRule)
|
||||||
|
|
||||||
glog.V(2).Infof("Deleting GCE ForwardingRule %s", t.SelfLink)
|
glog.V(2).Infof("Deleting GCE ForwardingRule %s", t.SelfLink)
|
||||||
|
@ -541,7 +541,7 @@ func deleteForwardingRule(cloud fi.Cloud, r *ResourceTracker) error {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
op, err := c.Compute.ForwardingRules.Delete(u.Project, u.Region, u.Name).Do()
|
op, err := c.Compute().ForwardingRules.Delete(u.Project, u.Region, u.Name).Do()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
if gce.IsNotFound(err) {
|
if gce.IsNotFound(err) {
|
||||||
glog.Infof("ForwardingRule not found, assuming deleted: %q", t.SelfLink)
|
glog.Infof("ForwardingRule not found, assuming deleted: %q", t.SelfLink)
|
||||||
|
@ -554,7 +554,7 @@ func deleteForwardingRule(cloud fi.Cloud, r *ResourceTracker) error {
|
||||||
}
|
}
|
||||||
|
|
||||||
func deleteManagedInstance(cloud fi.Cloud, r *ResourceTracker) error {
|
func deleteManagedInstance(cloud fi.Cloud, r *ResourceTracker) error {
|
||||||
c := cloud.(*gce.GCECloud)
|
c := cloud.(gce.GCECloud)
|
||||||
selfLink := r.obj.(string)
|
selfLink := r.obj.(string)
|
||||||
|
|
||||||
glog.V(2).Infof("Deleting GCE Instance %s", selfLink)
|
glog.V(2).Infof("Deleting GCE Instance %s", selfLink)
|
||||||
|
@ -563,7 +563,7 @@ func deleteManagedInstance(cloud fi.Cloud, r *ResourceTracker) error {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
op, err := c.Compute.Instances.Delete(u.Project, u.Zone, u.Name).Do()
|
op, err := c.Compute().Instances.Delete(u.Project, u.Zone, u.Name).Do()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
if gce.IsNotFound(err) {
|
if gce.IsNotFound(err) {
|
||||||
glog.Infof("Instance not found, assuming deleted: %q", selfLink)
|
glog.Infof("Instance not found, assuming deleted: %q", selfLink)
|
||||||
|
@ -592,7 +592,7 @@ func (d *clusterDiscoveryGCE) listRoutes(resources map[string]*ResourceTracker)
|
||||||
ctx := context.Background()
|
ctx := context.Background()
|
||||||
|
|
||||||
// TODO: Push-down prefix?
|
// TODO: Push-down prefix?
|
||||||
err := c.Compute.Routes.List(c.Project).Pages(ctx, func(page *compute.RouteList) error {
|
err := c.Compute().Routes.List(c.Project()).Pages(ctx, func(page *compute.RouteList) error {
|
||||||
for _, r := range page.Items {
|
for _, r := range page.Items {
|
||||||
if !strings.HasPrefix(r.Name, prefix) {
|
if !strings.HasPrefix(r.Name, prefix) {
|
||||||
continue
|
continue
|
||||||
|
@ -646,7 +646,7 @@ func (d *clusterDiscoveryGCE) listRoutes(resources map[string]*ResourceTracker)
|
||||||
}
|
}
|
||||||
|
|
||||||
func deleteRoute(cloud fi.Cloud, r *ResourceTracker) error {
|
func deleteRoute(cloud fi.Cloud, r *ResourceTracker) error {
|
||||||
c := cloud.(*gce.GCECloud)
|
c := cloud.(gce.GCECloud)
|
||||||
t := r.obj.(*compute.Route)
|
t := r.obj.(*compute.Route)
|
||||||
|
|
||||||
glog.V(2).Infof("Deleting GCE Route %s", t.SelfLink)
|
glog.V(2).Infof("Deleting GCE Route %s", t.SelfLink)
|
||||||
|
@ -655,7 +655,7 @@ func deleteRoute(cloud fi.Cloud, r *ResourceTracker) error {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
op, err := c.Compute.Routes.Delete(u.Project, u.Name).Do()
|
op, err := c.Compute().Routes.Delete(u.Project, u.Name).Do()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
if gce.IsNotFound(err) {
|
if gce.IsNotFound(err) {
|
||||||
glog.Infof("Route not found, assuming deleted: %q", t.SelfLink)
|
glog.Infof("Route not found, assuming deleted: %q", t.SelfLink)
|
||||||
|
@ -674,7 +674,7 @@ func (d *clusterDiscoveryGCE) listAddresses() ([]*ResourceTracker, error) {
|
||||||
|
|
||||||
ctx := context.Background()
|
ctx := context.Background()
|
||||||
|
|
||||||
err := c.Compute.Addresses.List(c.Project, c.Region).Pages(ctx, func(page *compute.AddressList) error {
|
err := c.Compute().Addresses.List(c.Project(), c.Region()).Pages(ctx, func(page *compute.AddressList) error {
|
||||||
for _, a := range page.Items {
|
for _, a := range page.Items {
|
||||||
if !d.matchesClusterName(a.Name) {
|
if !d.matchesClusterName(a.Name) {
|
||||||
glog.V(8).Infof("Skipping Address with name %q", a.Name)
|
glog.V(8).Infof("Skipping Address with name %q", a.Name)
|
||||||
|
@ -702,7 +702,7 @@ func (d *clusterDiscoveryGCE) listAddresses() ([]*ResourceTracker, error) {
|
||||||
}
|
}
|
||||||
|
|
||||||
func deleteAddress(cloud fi.Cloud, r *ResourceTracker) error {
|
func deleteAddress(cloud fi.Cloud, r *ResourceTracker) error {
|
||||||
c := cloud.(*gce.GCECloud)
|
c := cloud.(gce.GCECloud)
|
||||||
t := r.obj.(*compute.Address)
|
t := r.obj.(*compute.Address)
|
||||||
|
|
||||||
glog.V(2).Infof("Deleting GCE Address %s", t.SelfLink)
|
glog.V(2).Infof("Deleting GCE Address %s", t.SelfLink)
|
||||||
|
@ -711,7 +711,7 @@ func deleteAddress(cloud fi.Cloud, r *ResourceTracker) error {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
op, err := c.Compute.Addresses.Delete(u.Project, u.Region, u.Name).Do()
|
op, err := c.Compute().Addresses.Delete(u.Project, u.Region, u.Name).Do()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
if gce.IsNotFound(err) {
|
if gce.IsNotFound(err) {
|
||||||
glog.Infof("Address not found, assuming deleted: %q", t.SelfLink)
|
glog.Infof("Address not found, assuming deleted: %q", t.SelfLink)
|
||||||
|
|
|
@ -310,9 +310,9 @@ func (c *ApplyClusterCmd) Run() error {
|
||||||
switch kops.CloudProviderID(cluster.Spec.CloudProvider) {
|
switch kops.CloudProviderID(cluster.Spec.CloudProvider) {
|
||||||
case kops.CloudProviderGCE:
|
case kops.CloudProviderGCE:
|
||||||
{
|
{
|
||||||
gceCloud := cloud.(*gce.GCECloud)
|
gceCloud := cloud.(gce.GCECloud)
|
||||||
region = gceCloud.Region
|
region = gceCloud.Region()
|
||||||
project = gceCloud.Project
|
project = gceCloud.Project()
|
||||||
|
|
||||||
if !AlphaAllowGCE.Enabled() {
|
if !AlphaAllowGCE.Enabled() {
|
||||||
return fmt.Errorf("GCE support is currently alpha, and is feature-gated. export KOPS_FEATURE_FLAGS=AlphaAllowGCE")
|
return fmt.Errorf("GCE support is currently alpha, and is feature-gated. export KOPS_FEATURE_FLAGS=AlphaAllowGCE")
|
||||||
|
@ -706,7 +706,7 @@ func (c *ApplyClusterCmd) Run() error {
|
||||||
case TargetDirect:
|
case TargetDirect:
|
||||||
switch cluster.Spec.CloudProvider {
|
switch cluster.Spec.CloudProvider {
|
||||||
case "gce":
|
case "gce":
|
||||||
target = gce.NewGCEAPITarget(cloud.(*gce.GCECloud))
|
target = gce.NewGCEAPITarget(cloud.(gce.GCECloud))
|
||||||
case "aws":
|
case "aws":
|
||||||
target = awsup.NewAWSAPITarget(cloud.(awsup.AWSCloud))
|
target = awsup.NewAWSAPITarget(cloud.(awsup.AWSCloud))
|
||||||
case "digitalocean":
|
case "digitalocean":
|
||||||
|
|
|
@ -21,12 +21,12 @@ import (
|
||||||
)
|
)
|
||||||
|
|
||||||
type GCEAPITarget struct {
|
type GCEAPITarget struct {
|
||||||
Cloud *GCECloud
|
Cloud GCECloud
|
||||||
}
|
}
|
||||||
|
|
||||||
var _ fi.Target = &GCEAPITarget{}
|
var _ fi.Target = &GCEAPITarget{}
|
||||||
|
|
||||||
func NewGCEAPITarget(cloud *GCECloud) *GCEAPITarget {
|
func NewGCEAPITarget(cloud GCECloud) *GCEAPITarget {
|
||||||
return &GCEAPITarget{
|
return &GCEAPITarget{
|
||||||
Cloud: cloud,
|
Cloud: cloud,
|
||||||
}
|
}
|
||||||
|
|
|
@ -29,24 +29,36 @@ import (
|
||||||
"k8s.io/kubernetes/federation/pkg/dnsprovider/providers/google/clouddns"
|
"k8s.io/kubernetes/federation/pkg/dnsprovider/providers/google/clouddns"
|
||||||
)
|
)
|
||||||
|
|
||||||
type GCECloud struct {
|
type GCECloud interface {
|
||||||
Compute *compute.Service
|
fi.Cloud
|
||||||
Storage *storage.Service
|
Compute() *compute.Service
|
||||||
|
Storage() *storage.Service
|
||||||
|
|
||||||
Region string
|
Region() string
|
||||||
Project string
|
Project() string
|
||||||
|
WaitForOp(op *compute.Operation) error
|
||||||
|
GetApiIngressStatus(cluster *kops.Cluster) ([]kops.ApiIngressStatus, error)
|
||||||
|
Labels() map[string]string
|
||||||
|
}
|
||||||
|
|
||||||
|
type gceCloudImplementation struct {
|
||||||
|
compute *compute.Service
|
||||||
|
storage *storage.Service
|
||||||
|
|
||||||
|
region string
|
||||||
|
project string
|
||||||
|
|
||||||
labels map[string]string
|
labels map[string]string
|
||||||
}
|
}
|
||||||
|
|
||||||
var _ fi.Cloud = &GCECloud{}
|
var _ fi.Cloud = &gceCloudImplementation{}
|
||||||
|
|
||||||
func (c *GCECloud) ProviderID() kops.CloudProviderID {
|
func (c *gceCloudImplementation) ProviderID() kops.CloudProviderID {
|
||||||
return kops.CloudProviderGCE
|
return kops.CloudProviderGCE
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewGCECloud(region string, project string, labels map[string]string) (*GCECloud, error) {
|
func NewGCECloud(region string, project string, labels map[string]string) (GCECloud, error) {
|
||||||
c := &GCECloud{Region: region, Project: project}
|
c := &gceCloudImplementation{region: region, project: project}
|
||||||
|
|
||||||
ctx := context.Background()
|
ctx := context.Background()
|
||||||
|
|
||||||
|
@ -58,33 +70,53 @@ func NewGCECloud(region string, project string, labels map[string]string) (*GCEC
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("error building compute API client: %v", err)
|
return nil, fmt.Errorf("error building compute API client: %v", err)
|
||||||
}
|
}
|
||||||
c.Compute = computeService
|
c.compute = computeService
|
||||||
|
|
||||||
storageService, err := storage.New(client)
|
storageService, err := storage.New(client)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("error building storage API client: %v", err)
|
return nil, fmt.Errorf("error building storage API client: %v", err)
|
||||||
}
|
}
|
||||||
c.Storage = storageService
|
c.storage = storageService
|
||||||
|
|
||||||
c.labels = labels
|
c.labels = labels
|
||||||
|
|
||||||
return c, nil
|
return c, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *GCECloud) DNS() (dnsprovider.Interface, error) {
|
// Compute returns private struct element compute.
|
||||||
provider, err := clouddns.CreateInterface(c.Project, nil)
|
func (c *gceCloudImplementation) Compute() *compute.Service {
|
||||||
|
return c.compute
|
||||||
|
}
|
||||||
|
|
||||||
|
// Storage returns private struct element storage.
|
||||||
|
func (c *gceCloudImplementation) Storage() *storage.Service {
|
||||||
|
return c.storage
|
||||||
|
}
|
||||||
|
|
||||||
|
// Region returns private struct element region.
|
||||||
|
func (c *gceCloudImplementation) Region() string {
|
||||||
|
return c.region
|
||||||
|
}
|
||||||
|
|
||||||
|
// Project returns private struct element project.
|
||||||
|
func (c *gceCloudImplementation) Project() string {
|
||||||
|
return c.project
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *gceCloudImplementation) DNS() (dnsprovider.Interface, error) {
|
||||||
|
provider, err := clouddns.CreateInterface(c.project, nil)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("Error building (k8s) DNS provider: %v", err)
|
return nil, fmt.Errorf("Error building (k8s) DNS provider: %v", err)
|
||||||
}
|
}
|
||||||
return provider, nil
|
return provider, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *GCECloud) FindVPCInfo(id string) (*fi.VPCInfo, error) {
|
func (c *gceCloudImplementation) FindVPCInfo(id string) (*fi.VPCInfo, error) {
|
||||||
glog.Warningf("FindVPCInfo not (yet) implemented on GCE")
|
glog.Warningf("FindVPCInfo not (yet) implemented on GCE")
|
||||||
return nil, nil
|
return nil, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *GCECloud) Labels() map[string]string {
|
func (c *gceCloudImplementation) Labels() map[string]string {
|
||||||
// Defensive copy
|
// Defensive copy
|
||||||
tags := make(map[string]string)
|
tags := make(map[string]string)
|
||||||
for k, v := range c.labels {
|
for k, v := range c.labels {
|
||||||
|
@ -93,18 +125,18 @@ func (c *GCECloud) Labels() map[string]string {
|
||||||
return tags
|
return tags
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *GCECloud) WaitForOp(op *compute.Operation) error {
|
func (c *gceCloudImplementation) WaitForOp(op *compute.Operation) error {
|
||||||
return WaitForOp(c.Compute, op)
|
return WaitForOp(c.compute, op)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *GCECloud) GetApiIngressStatus(cluster *kops.Cluster) ([]kops.ApiIngressStatus, error) {
|
func (c *gceCloudImplementation) GetApiIngressStatus(cluster *kops.Cluster) ([]kops.ApiIngressStatus, error) {
|
||||||
var ingresses []kops.ApiIngressStatus
|
var ingresses []kops.ApiIngressStatus
|
||||||
|
|
||||||
// Note that this must match GCEModelContext::NameForForwardingRule
|
// Note that this must match GCEModelContext::NameForForwardingRule
|
||||||
name := SafeObjectName("api", cluster.ObjectMeta.Name)
|
name := SafeObjectName("api", cluster.ObjectMeta.Name)
|
||||||
|
|
||||||
glog.V(2).Infof("Querying GCE to find ForwardingRules for API (%q)", name)
|
glog.V(2).Infof("Querying GCE to find ForwardingRules for API (%q)", name)
|
||||||
forwardingRule, err := c.Compute.ForwardingRules.Get(c.Project, c.Region, name).Do()
|
forwardingRule, err := c.compute.ForwardingRules.Get(c.project, c.region, name).Do()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
if !IsNotFound(err) {
|
if !IsNotFound(err) {
|
||||||
forwardingRule = nil
|
forwardingRule = nil
|
||||||
|
|
|
@ -34,7 +34,7 @@ type Address struct {
|
||||||
}
|
}
|
||||||
|
|
||||||
func (e *Address) Find(c *fi.Context) (*Address, error) {
|
func (e *Address) Find(c *fi.Context) (*Address, error) {
|
||||||
actual, err := e.find(c.Cloud.(*gce.GCECloud))
|
actual, err := e.find(c.Cloud.(gce.GCECloud))
|
||||||
if actual != nil && err == nil {
|
if actual != nil && err == nil {
|
||||||
if e.IPAddress == nil {
|
if e.IPAddress == nil {
|
||||||
e.IPAddress = actual.IPAddress
|
e.IPAddress = actual.IPAddress
|
||||||
|
@ -43,9 +43,9 @@ func (e *Address) Find(c *fi.Context) (*Address, error) {
|
||||||
return actual, err
|
return actual, err
|
||||||
}
|
}
|
||||||
|
|
||||||
func findAddressByIP(cloud *gce.GCECloud, ip string) (*Address, error) {
|
func findAddressByIP(cloud gce.GCECloud, ip string) (*Address, error) {
|
||||||
// Technically this is a regex, but it doesn't matter...
|
// Technically this is a regex, but it doesn't matter...
|
||||||
r, err := cloud.Compute.Addresses.List(cloud.Project, cloud.Region).Filter("address eq " + ip).Do()
|
r, err := cloud.Compute().Addresses.List(cloud.Project(), cloud.Region()).Filter("address eq " + ip).Do()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("error listing IPAddresss: %v", err)
|
return nil, fmt.Errorf("error listing IPAddresss: %v", err)
|
||||||
}
|
}
|
||||||
|
@ -64,8 +64,8 @@ func findAddressByIP(cloud *gce.GCECloud, ip string) (*Address, error) {
|
||||||
return actual, nil
|
return actual, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (e *Address) find(cloud *gce.GCECloud) (*Address, error) {
|
func (e *Address) find(cloud gce.GCECloud) (*Address, error) {
|
||||||
r, err := cloud.Compute.Addresses.Get(cloud.Project, cloud.Region, *e.Name).Do()
|
r, err := cloud.Compute().Addresses.Get(cloud.Project(), cloud.Region(), *e.Name).Do()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
if gce.IsNotFound(err) {
|
if gce.IsNotFound(err) {
|
||||||
return nil, nil
|
return nil, nil
|
||||||
|
@ -84,7 +84,7 @@ func (e *Address) find(cloud *gce.GCECloud) (*Address, error) {
|
||||||
var _ fi.HasAddress = &Address{}
|
var _ fi.HasAddress = &Address{}
|
||||||
|
|
||||||
func (e *Address) FindIPAddress(context *fi.Context) (*string, error) {
|
func (e *Address) FindIPAddress(context *fi.Context) (*string, error) {
|
||||||
actual, err := e.find(context.Cloud.(*gce.GCECloud))
|
actual, err := e.find(context.Cloud.(gce.GCECloud))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("error querying for IPAddress: %v", err)
|
return nil, fmt.Errorf("error querying for IPAddress: %v", err)
|
||||||
}
|
}
|
||||||
|
@ -110,22 +110,23 @@ func (_ *Address) CheckChanges(a, e, changes *Address) error {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (_ *Address) RenderGCE(t *gce.GCEAPITarget, a, e, changes *Address) error {
|
func (_ *Address) RenderGCE(t gce.GCEAPITarget, a, e, changes *Address) error {
|
||||||
|
cloud := t.Cloud
|
||||||
addr := &compute.Address{
|
addr := &compute.Address{
|
||||||
Name: *e.Name,
|
Name: *e.Name,
|
||||||
Address: fi.StringValue(e.IPAddress),
|
Address: fi.StringValue(e.IPAddress),
|
||||||
Region: t.Cloud.Region,
|
Region: cloud.Region(),
|
||||||
}
|
}
|
||||||
|
|
||||||
if a == nil {
|
if a == nil {
|
||||||
glog.Infof("GCE creating address: %q", addr.Name)
|
glog.Infof("GCE creating address: %q", addr.Name)
|
||||||
|
|
||||||
op, err := t.Cloud.Compute.Addresses.Insert(t.Cloud.Project, t.Cloud.Region, addr).Do()
|
op, err := cloud.Compute().Addresses.Insert(cloud.Project(), cloud.Region(), addr).Do()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("error creating IPAddress: %v", err)
|
return fmt.Errorf("error creating IPAddress: %v", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
if err := t.Cloud.WaitForOp(op); err != nil {
|
if err := cloud.WaitForOp(op); err != nil {
|
||||||
return fmt.Errorf("error waiting for IPAddress: %v", err)
|
return fmt.Errorf("error waiting for IPAddress: %v", err)
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
|
|
@ -45,9 +45,9 @@ func (e *Disk) CompareWithID() *string {
|
||||||
}
|
}
|
||||||
|
|
||||||
func (e *Disk) Find(c *fi.Context) (*Disk, error) {
|
func (e *Disk) Find(c *fi.Context) (*Disk, error) {
|
||||||
cloud := c.Cloud.(*gce.GCECloud)
|
cloud := c.Cloud.(gce.GCECloud)
|
||||||
|
|
||||||
r, err := cloud.Compute.Disks.Get(cloud.Project, *e.Zone, *e.Name).Do()
|
r, err := cloud.Compute().Disks.Get(cloud.Project(), *e.Zone, *e.Name).Do()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
if gce.IsNotFound(err) {
|
if gce.IsNotFound(err) {
|
||||||
return nil, nil
|
return nil, nil
|
||||||
|
@ -100,8 +100,9 @@ func (_ *Disk) CheckChanges(a, e, changes *Disk) error {
|
||||||
}
|
}
|
||||||
|
|
||||||
func (_ *Disk) RenderGCE(t *gce.GCEAPITarget, a, e, changes *Disk) error {
|
func (_ *Disk) RenderGCE(t *gce.GCEAPITarget, a, e, changes *Disk) error {
|
||||||
|
cloud := t.Cloud
|
||||||
typeURL := fmt.Sprintf("https://www.googleapis.com/compute/v1/projects/%s/zones/%s/diskTypes/%s",
|
typeURL := fmt.Sprintf("https://www.googleapis.com/compute/v1/projects/%s/zones/%s/diskTypes/%s",
|
||||||
t.Cloud.Project,
|
cloud.Project(),
|
||||||
*e.Zone,
|
*e.Zone,
|
||||||
*e.VolumeType)
|
*e.VolumeType)
|
||||||
|
|
||||||
|
@ -112,14 +113,14 @@ func (_ *Disk) RenderGCE(t *gce.GCEAPITarget, a, e, changes *Disk) error {
|
||||||
}
|
}
|
||||||
|
|
||||||
if a == nil {
|
if a == nil {
|
||||||
_, err := t.Cloud.Compute.Disks.Insert(t.Cloud.Project, *e.Zone, disk).Do()
|
_, err := cloud.Compute().Disks.Insert(t.Cloud.Project(), *e.Zone, disk).Do()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("error creating Disk: %v", err)
|
return fmt.Errorf("error creating Disk: %v", err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if changes.Labels != nil {
|
if changes.Labels != nil {
|
||||||
d, err := t.Cloud.Compute.Disks.Get(t.Cloud.Project, *e.Zone, disk.Name).Do()
|
d, err := cloud.Compute().Disks.Get(t.Cloud.Project(), *e.Zone, disk.Name).Do()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("error reading created Disk: %v", err)
|
return fmt.Errorf("error reading created Disk: %v", err)
|
||||||
}
|
}
|
||||||
|
@ -142,7 +143,7 @@ func (_ *Disk) RenderGCE(t *gce.GCEAPITarget, a, e, changes *Disk) error {
|
||||||
labelsRequest.Labels[k] = v
|
labelsRequest.Labels[k] = v
|
||||||
}
|
}
|
||||||
glog.V(2).Infof("Setting labels on disk %q: %v", disk.Name, labelsRequest.Labels)
|
glog.V(2).Infof("Setting labels on disk %q: %v", disk.Name, labelsRequest.Labels)
|
||||||
_, err = t.Cloud.Compute.Disks.SetLabels(t.Cloud.Project, *e.Zone, disk.Name, labelsRequest).Do()
|
_, err = t.Cloud.Compute().Disks.SetLabels(t.Cloud.Project(), *e.Zone, disk.Name, labelsRequest).Do()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("error setting labels on created Disk: %v", err)
|
return fmt.Errorf("error setting labels on created Disk: %v", err)
|
||||||
}
|
}
|
||||||
|
|
|
@ -45,9 +45,9 @@ func (e *FirewallRule) CompareWithID() *string {
|
||||||
}
|
}
|
||||||
|
|
||||||
func (e *FirewallRule) Find(c *fi.Context) (*FirewallRule, error) {
|
func (e *FirewallRule) Find(c *fi.Context) (*FirewallRule, error) {
|
||||||
cloud := c.Cloud.(*gce.GCECloud)
|
cloud := c.Cloud.(gce.GCECloud)
|
||||||
|
|
||||||
r, err := cloud.Compute.Firewalls.Get(cloud.Project, *e.Name).Do()
|
r, err := cloud.Compute().Firewalls.Get(cloud.Project(), *e.Name).Do()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
if gce.IsNotFound(err) {
|
if gce.IsNotFound(err) {
|
||||||
return nil, nil
|
return nil, nil
|
||||||
|
@ -132,18 +132,19 @@ func (e *FirewallRule) mapToGCE(project string) (*compute.Firewall, error) {
|
||||||
}
|
}
|
||||||
|
|
||||||
func (_ *FirewallRule) RenderGCE(t *gce.GCEAPITarget, a, e, changes *FirewallRule) error {
|
func (_ *FirewallRule) RenderGCE(t *gce.GCEAPITarget, a, e, changes *FirewallRule) error {
|
||||||
firewall, err := e.mapToGCE(t.Cloud.Project)
|
cloud := t.Cloud
|
||||||
|
firewall, err := e.mapToGCE(cloud.Project())
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
if a == nil {
|
if a == nil {
|
||||||
_, err := t.Cloud.Compute.Firewalls.Insert(t.Cloud.Project, firewall).Do()
|
_, err := t.Cloud.Compute().Firewalls.Insert(t.Cloud.Project(), firewall).Do()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("error creating FirewallRule: %v", err)
|
return fmt.Errorf("error creating FirewallRule: %v", err)
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
_, err := t.Cloud.Compute.Firewalls.Update(t.Cloud.Project, *e.Name, firewall).Do()
|
_, err := t.Cloud.Compute().Firewalls.Update(t.Cloud.Project(), *e.Name, firewall).Do()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("error creating FirewallRule: %v", err)
|
return fmt.Errorf("error creating FirewallRule: %v", err)
|
||||||
}
|
}
|
||||||
|
|
|
@ -44,10 +44,10 @@ func (e *ForwardingRule) CompareWithID() *string {
|
||||||
}
|
}
|
||||||
|
|
||||||
func (e *ForwardingRule) Find(c *fi.Context) (*ForwardingRule, error) {
|
func (e *ForwardingRule) Find(c *fi.Context) (*ForwardingRule, error) {
|
||||||
cloud := c.Cloud.(*gce.GCECloud)
|
cloud := c.Cloud.(gce.GCECloud)
|
||||||
name := fi.StringValue(e.Name)
|
name := fi.StringValue(e.Name)
|
||||||
|
|
||||||
r, err := cloud.Compute.ForwardingRules.Get(cloud.Project, cloud.Region, name).Do()
|
r, err := cloud.Compute().ForwardingRules.Get(cloud.Project(), cloud.Region(), name).Do()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
if gce.IsNotFound(err) {
|
if gce.IsNotFound(err) {
|
||||||
return nil, nil
|
return nil, nil
|
||||||
|
@ -121,7 +121,7 @@ func (_ *ForwardingRule) RenderGCE(t *gce.GCEAPITarget, a, e, changes *Forwardin
|
||||||
if a == nil {
|
if a == nil {
|
||||||
glog.V(4).Infof("Creating ForwardingRule %q", o.Name)
|
glog.V(4).Infof("Creating ForwardingRule %q", o.Name)
|
||||||
|
|
||||||
_, err := t.Cloud.Compute.ForwardingRules.Insert(t.Cloud.Project, t.Cloud.Region, o).Do()
|
_, err := t.Cloud.Compute().ForwardingRules.Insert(t.Cloud.Project(), t.Cloud.Region(), o).Do()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("error creating ForwardingRule %q: %v", o.Name, err)
|
return fmt.Errorf("error creating ForwardingRule %q: %v", o.Name, err)
|
||||||
}
|
}
|
||||||
|
|
|
@ -60,9 +60,9 @@ func (e *Instance) CompareWithID() *string {
|
||||||
}
|
}
|
||||||
|
|
||||||
func (e *Instance) Find(c *fi.Context) (*Instance, error) {
|
func (e *Instance) Find(c *fi.Context) (*Instance, error) {
|
||||||
cloud := c.Cloud.(*gce.GCECloud)
|
cloud := c.Cloud.(gce.GCECloud)
|
||||||
|
|
||||||
r, err := cloud.Compute.Instances.Get(cloud.Project, *e.Zone, *e.Name).Do()
|
r, err := cloud.Compute().Instances.Get(cloud.Project(), *e.Zone, *e.Name).Do()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
if gce.IsNotFound(err) {
|
if gce.IsNotFound(err) {
|
||||||
return nil, nil
|
return nil, nil
|
||||||
|
@ -88,7 +88,7 @@ func (e *Instance) Find(c *fi.Context) (*Instance, error) {
|
||||||
if len(ni.AccessConfigs) != 0 {
|
if len(ni.AccessConfigs) != 0 {
|
||||||
ac := ni.AccessConfigs[0]
|
ac := ni.AccessConfigs[0]
|
||||||
if ac.NatIP != "" {
|
if ac.NatIP != "" {
|
||||||
addr, err := cloud.Compute.Addresses.List(cloud.Project, cloud.Region).Filter("address eq " + ac.NatIP).Do()
|
addr, err := cloud.Compute().Addresses.List(cloud.Project(), cloud.Region()).Filter("address eq " + ac.NatIP).Do()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("error querying for address %q: %v", ac.NatIP, err)
|
return nil, fmt.Errorf("error querying for address %q: %v", ac.NatIP, err)
|
||||||
} else if len(addr.Items) != 0 {
|
} else if len(addr.Items) != 0 {
|
||||||
|
@ -113,7 +113,7 @@ func (e *Instance) Find(c *fi.Context) (*Instance, error) {
|
||||||
|
|
||||||
// TODO: Parse source URL instead of assuming same project/zone?
|
// TODO: Parse source URL instead of assuming same project/zone?
|
||||||
name := lastComponent(source)
|
name := lastComponent(source)
|
||||||
d, err := cloud.Compute.Disks.Get(cloud.Project, *e.Zone, name).Do()
|
d, err := cloud.Compute().Disks.Get(cloud.Project(), *e.Zone, name).Do()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
if gce.IsNotFound(err) {
|
if gce.IsNotFound(err) {
|
||||||
return nil, fmt.Errorf("disk not found %q: %v", source, err)
|
return nil, fmt.Errorf("disk not found %q: %v", source, err)
|
||||||
|
@ -121,7 +121,7 @@ func (e *Instance) Find(c *fi.Context) (*Instance, error) {
|
||||||
return nil, fmt.Errorf("error querying for disk %q: %v", source, err)
|
return nil, fmt.Errorf("error querying for disk %q: %v", source, err)
|
||||||
}
|
}
|
||||||
|
|
||||||
image, err := ShortenImageURL(cloud.Project, d.SourceImage)
|
image, err := ShortenImageURL(cloud.Project(), d.SourceImage)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("error parsing source image URL: %v", err)
|
return nil, fmt.Errorf("error parsing source image URL: %v", err)
|
||||||
}
|
}
|
||||||
|
@ -311,7 +311,7 @@ func (i *Instance) isZero() bool {
|
||||||
|
|
||||||
func (_ *Instance) RenderGCE(t *gce.GCEAPITarget, a, e, changes *Instance) error {
|
func (_ *Instance) RenderGCE(t *gce.GCEAPITarget, a, e, changes *Instance) error {
|
||||||
cloud := t.Cloud
|
cloud := t.Cloud
|
||||||
project := cloud.Project
|
project := cloud.Project()
|
||||||
zone := *e.Zone
|
zone := *e.Zone
|
||||||
|
|
||||||
ipAddressResolver := func(ip *Address) (*string, error) {
|
ipAddressResolver := func(ip *Address) (*string, error) {
|
||||||
|
@ -325,7 +325,7 @@ func (_ *Instance) RenderGCE(t *gce.GCEAPITarget, a, e, changes *Instance) error
|
||||||
|
|
||||||
if a == nil {
|
if a == nil {
|
||||||
glog.V(2).Infof("Creating instance %q", i.Name)
|
glog.V(2).Infof("Creating instance %q", i.Name)
|
||||||
_, err := t.Cloud.Compute.Instances.Insert(project, zone, i).Do()
|
_, err := cloud.Compute().Instances.Insert(project, zone, i).Do()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("error creating Instance: %v", err)
|
return fmt.Errorf("error creating Instance: %v", err)
|
||||||
}
|
}
|
||||||
|
@ -335,7 +335,7 @@ func (_ *Instance) RenderGCE(t *gce.GCEAPITarget, a, e, changes *Instance) error
|
||||||
|
|
||||||
i.Metadata.Fingerprint = a.metadataFingerprint
|
i.Metadata.Fingerprint = a.metadataFingerprint
|
||||||
|
|
||||||
op, err := cloud.Compute.Instances.SetMetadata(project, zone, i.Name, i.Metadata).Do()
|
op, err := cloud.Compute().Instances.SetMetadata(project, zone, i.Name, i.Metadata).Do()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("error setting metadata on instance: %v", err)
|
return fmt.Errorf("error setting metadata on instance: %v", err)
|
||||||
}
|
}
|
||||||
|
|
|
@ -45,9 +45,9 @@ func (e *InstanceGroupManager) CompareWithID() *string {
|
||||||
}
|
}
|
||||||
|
|
||||||
func (e *InstanceGroupManager) Find(c *fi.Context) (*InstanceGroupManager, error) {
|
func (e *InstanceGroupManager) Find(c *fi.Context) (*InstanceGroupManager, error) {
|
||||||
cloud := c.Cloud.(*gce.GCECloud)
|
cloud := c.Cloud.(gce.GCECloud)
|
||||||
|
|
||||||
r, err := cloud.Compute.InstanceGroupManagers.Get(cloud.Project, *e.Zone, *e.Name).Do()
|
r, err := cloud.Compute().InstanceGroupManagers.Get(cloud.Project(), *e.Zone, *e.Name).Do()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
if gce.IsNotFound(err) {
|
if gce.IsNotFound(err) {
|
||||||
return nil, nil
|
return nil, nil
|
||||||
|
@ -81,7 +81,7 @@ func (_ *InstanceGroupManager) CheckChanges(a, e, changes *InstanceGroupManager)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (_ *InstanceGroupManager) RenderGCE(t *gce.GCEAPITarget, a, e, changes *InstanceGroupManager) error {
|
func (_ *InstanceGroupManager) RenderGCE(t *gce.GCEAPITarget, a, e, changes *InstanceGroupManager) error {
|
||||||
project := t.Cloud.Project
|
project := t.Cloud.Project()
|
||||||
|
|
||||||
instanceTemplateURL, err := e.InstanceTemplate.URL(project)
|
instanceTemplateURL, err := e.InstanceTemplate.URL(project)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@ -102,7 +102,7 @@ func (_ *InstanceGroupManager) RenderGCE(t *gce.GCEAPITarget, a, e, changes *Ins
|
||||||
|
|
||||||
if a == nil {
|
if a == nil {
|
||||||
//for {
|
//for {
|
||||||
op, err := t.Cloud.Compute.InstanceGroupManagers.Insert(t.Cloud.Project, *e.Zone, i).Do()
|
op, err := t.Cloud.Compute().InstanceGroupManagers.Insert(t.Cloud.Project(), *e.Zone, i).Do()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("error creating InstanceGroupManager: %v", err)
|
return fmt.Errorf("error creating InstanceGroupManager: %v", err)
|
||||||
}
|
}
|
||||||
|
@ -115,7 +115,7 @@ func (_ *InstanceGroupManager) RenderGCE(t *gce.GCEAPITarget, a, e, changes *Ins
|
||||||
request := &compute.InstanceGroupManagersSetTargetPoolsRequest{
|
request := &compute.InstanceGroupManagersSetTargetPoolsRequest{
|
||||||
TargetPools: i.TargetPools,
|
TargetPools: i.TargetPools,
|
||||||
}
|
}
|
||||||
op, err := t.Cloud.Compute.InstanceGroupManagers.SetTargetPools(t.Cloud.Project, *e.Zone, i.Name, request).Do()
|
op, err := t.Cloud.Compute().InstanceGroupManagers.SetTargetPools(t.Cloud.Project(), *e.Zone, i.Name, request).Do()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("error updating TargetPools for InstanceGroupManager: %v", err)
|
return fmt.Errorf("error updating TargetPools for InstanceGroupManager: %v", err)
|
||||||
}
|
}
|
||||||
|
@ -131,7 +131,7 @@ func (_ *InstanceGroupManager) RenderGCE(t *gce.GCEAPITarget, a, e, changes *Ins
|
||||||
request := &compute.InstanceGroupManagersSetInstanceTemplateRequest{
|
request := &compute.InstanceGroupManagersSetInstanceTemplateRequest{
|
||||||
InstanceTemplate: instanceTemplateURL,
|
InstanceTemplate: instanceTemplateURL,
|
||||||
}
|
}
|
||||||
op, err := t.Cloud.Compute.InstanceGroupManagers.SetInstanceTemplate(t.Cloud.Project, *e.Zone, i.Name, request).Do()
|
op, err := t.Cloud.Compute().InstanceGroupManagers.SetInstanceTemplate(t.Cloud.Project(), *e.Zone, i.Name, request).Do()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("error updating InstanceTemplate for InstanceGroupManager: %v", err)
|
return fmt.Errorf("error updating InstanceTemplate for InstanceGroupManager: %v", err)
|
||||||
}
|
}
|
||||||
|
|
|
@ -67,9 +67,9 @@ func (e *InstanceTemplate) CompareWithID() *string {
|
||||||
}
|
}
|
||||||
|
|
||||||
func (e *InstanceTemplate) Find(c *fi.Context) (*InstanceTemplate, error) {
|
func (e *InstanceTemplate) Find(c *fi.Context) (*InstanceTemplate, error) {
|
||||||
cloud := c.Cloud.(*gce.GCECloud)
|
cloud := c.Cloud.(gce.GCECloud)
|
||||||
|
|
||||||
response, err := cloud.Compute.InstanceTemplates.List(cloud.Project).Do()
|
response, err := cloud.Compute().InstanceTemplates.List(cloud.Project()).Do()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
if gce.IsNotFound(err) {
|
if gce.IsNotFound(err) {
|
||||||
return nil, nil
|
return nil, nil
|
||||||
|
@ -77,7 +77,7 @@ func (e *InstanceTemplate) Find(c *fi.Context) (*InstanceTemplate, error) {
|
||||||
return nil, fmt.Errorf("error listing InstanceTemplates: %v", err)
|
return nil, fmt.Errorf("error listing InstanceTemplates: %v", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
expected, err := e.mapToGCE(cloud.Project)
|
expected, err := e.mapToGCE(cloud.Project())
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
@ -101,7 +101,7 @@ func (e *InstanceTemplate) Find(c *fi.Context) (*InstanceTemplate, error) {
|
||||||
actual.MachineType = fi.String(lastComponent(p.MachineType))
|
actual.MachineType = fi.String(lastComponent(p.MachineType))
|
||||||
actual.CanIPForward = &p.CanIpForward
|
actual.CanIPForward = &p.CanIpForward
|
||||||
|
|
||||||
bootDiskImage, err := ShortenImageURL(cloud.Project, p.Disks[0].InitializeParams.SourceImage)
|
bootDiskImage, err := ShortenImageURL(cloud.Project(), p.Disks[0].InitializeParams.SourceImage)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("error parsing source image URL: %v", err)
|
return nil, fmt.Errorf("error parsing source image URL: %v", err)
|
||||||
}
|
}
|
||||||
|
@ -342,7 +342,7 @@ func (e *InstanceTemplate) URL(project string) (string, error) {
|
||||||
}
|
}
|
||||||
|
|
||||||
func (_ *InstanceTemplate) RenderGCE(t *gce.GCEAPITarget, a, e, changes *InstanceTemplate) error {
|
func (_ *InstanceTemplate) RenderGCE(t *gce.GCEAPITarget, a, e, changes *InstanceTemplate) error {
|
||||||
project := t.Cloud.Project
|
project := t.Cloud.Project()
|
||||||
|
|
||||||
i, err := e.mapToGCE(project)
|
i, err := e.mapToGCE(project)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@ -356,7 +356,7 @@ func (_ *InstanceTemplate) RenderGCE(t *gce.GCEAPITarget, a, e, changes *Instanc
|
||||||
e.ID = &name
|
e.ID = &name
|
||||||
i.Name = name
|
i.Name = name
|
||||||
|
|
||||||
op, err := t.Cloud.Compute.InstanceTemplates.Insert(t.Cloud.Project, i).Do()
|
op, err := t.Cloud.Compute().InstanceTemplates.Insert(t.Cloud.Project(), i).Do()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("error creating InstanceTemplate: %v", err)
|
return fmt.Errorf("error creating InstanceTemplate: %v", err)
|
||||||
}
|
}
|
||||||
|
|
|
@ -40,9 +40,9 @@ func (e *Network) CompareWithID() *string {
|
||||||
}
|
}
|
||||||
|
|
||||||
func (e *Network) Find(c *fi.Context) (*Network, error) {
|
func (e *Network) Find(c *fi.Context) (*Network, error) {
|
||||||
cloud := c.Cloud.(*gce.GCECloud)
|
cloud := c.Cloud.(gce.GCECloud)
|
||||||
|
|
||||||
r, err := cloud.Compute.Networks.Get(cloud.Project, *e.Name).Do()
|
r, err := cloud.Compute().Networks.Get(cloud.Project(), *e.Name).Do()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
if gce.IsNotFound(err) {
|
if gce.IsNotFound(err) {
|
||||||
return nil, nil
|
return nil, nil
|
||||||
|
@ -54,8 +54,8 @@ func (e *Network) Find(c *fi.Context) (*Network, error) {
|
||||||
actual.Name = &r.Name
|
actual.Name = &r.Name
|
||||||
actual.CIDR = &r.IPv4Range
|
actual.CIDR = &r.IPv4Range
|
||||||
|
|
||||||
if r.SelfLink != e.URL(cloud.Project) {
|
if r.SelfLink != e.URL(cloud.Project()) {
|
||||||
glog.Warningf("SelfLink did not match URL: %q vs %q", r.SelfLink, e.URL(cloud.Project))
|
glog.Warningf("SelfLink did not match URL: %q vs %q", r.SelfLink, e.URL(cloud.Project()))
|
||||||
}
|
}
|
||||||
|
|
||||||
return actual, nil
|
return actual, nil
|
||||||
|
@ -98,7 +98,7 @@ func (_ *Network) RenderGCE(t *gce.GCEAPITarget, a, e, changes *Network) error {
|
||||||
|
|
||||||
Name: *e.Name,
|
Name: *e.Name,
|
||||||
}
|
}
|
||||||
_, err := t.Cloud.Compute.Networks.Insert(t.Cloud.Project, network).Do()
|
_, err := t.Cloud.Compute().Networks.Insert(t.Cloud.Project(), network).Do()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("error creating Network: %v", err)
|
return fmt.Errorf("error creating Network: %v", err)
|
||||||
}
|
}
|
||||||
|
|
|
@ -42,9 +42,9 @@ func (e *Subnet) CompareWithID() *string {
|
||||||
}
|
}
|
||||||
|
|
||||||
func (e *Subnet) Find(c *fi.Context) (*Subnet, error) {
|
func (e *Subnet) Find(c *fi.Context) (*Subnet, error) {
|
||||||
cloud := c.Cloud.(*gce.GCECloud)
|
cloud := c.Cloud.(gce.GCECloud)
|
||||||
|
|
||||||
s, err := cloud.Compute.Subnetworks.Get(cloud.Project, cloud.Region, *e.Name).Do()
|
s, err := cloud.Compute().Subnetworks.Get(cloud.Project(), cloud.Region(), *e.Name).Do()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
if gce.IsNotFound(err) {
|
if gce.IsNotFound(err) {
|
||||||
return nil, nil
|
return nil, nil
|
||||||
|
@ -78,7 +78,7 @@ func (_ *Subnet) RenderGCE(t *gce.GCEAPITarget, a, e, changes *Subnet) error {
|
||||||
Name: *e.Name,
|
Name: *e.Name,
|
||||||
Network: *e.Network.Name,
|
Network: *e.Network.Name,
|
||||||
}
|
}
|
||||||
_, err := t.Cloud.Compute.Subnetworks.Insert(t.Cloud.Project, t.Cloud.Region, subnet).Do()
|
_, err := t.Cloud.Compute().Subnetworks.Insert(t.Cloud.Project(), t.Cloud.Region(), subnet).Do()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("error creating Subnet: %v", err)
|
return fmt.Errorf("error creating Subnet: %v", err)
|
||||||
}
|
}
|
||||||
|
|
|
@ -39,10 +39,10 @@ func (e *TargetPool) CompareWithID() *string {
|
||||||
}
|
}
|
||||||
|
|
||||||
func (e *TargetPool) Find(c *fi.Context) (*TargetPool, error) {
|
func (e *TargetPool) Find(c *fi.Context) (*TargetPool, error) {
|
||||||
cloud := c.Cloud.(*gce.GCECloud)
|
cloud := c.Cloud.(gce.GCECloud)
|
||||||
name := fi.StringValue(e.Name)
|
name := fi.StringValue(e.Name)
|
||||||
|
|
||||||
r, err := cloud.Compute.TargetPools.Get(cloud.Project, cloud.Region, name).Do()
|
r, err := cloud.Compute().TargetPools.Get(cloud.Project(), cloud.Region(), name).Do()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
if gce.IsNotFound(err) {
|
if gce.IsNotFound(err) {
|
||||||
return nil, nil
|
return nil, nil
|
||||||
|
@ -67,10 +67,10 @@ func (_ *TargetPool) CheckChanges(a, e, changes *TargetPool) error {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (e *TargetPool) URL(cloud *gce.GCECloud) string {
|
func (e *TargetPool) URL(cloud gce.GCECloud) string {
|
||||||
name := fi.StringValue(e.Name)
|
name := fi.StringValue(e.Name)
|
||||||
|
|
||||||
return fmt.Sprintf("https://www.googleapis.com/compute/v1/projects/%s/regions/%s/targetPools/%s", cloud.Project, cloud.Region, name)
|
return fmt.Sprintf("https://www.googleapis.com/compute/v1/projects/%s/regions/%s/targetPools/%s", cloud.Project(), cloud.Region(), name)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (_ *TargetPool) RenderGCE(t *gce.GCEAPITarget, a, e, changes *TargetPool) error {
|
func (_ *TargetPool) RenderGCE(t *gce.GCEAPITarget, a, e, changes *TargetPool) error {
|
||||||
|
@ -83,7 +83,7 @@ func (_ *TargetPool) RenderGCE(t *gce.GCEAPITarget, a, e, changes *TargetPool) e
|
||||||
if a == nil {
|
if a == nil {
|
||||||
glog.V(4).Infof("Creating TargetPool %q", o.Name)
|
glog.V(4).Infof("Creating TargetPool %q", o.Name)
|
||||||
|
|
||||||
op, err := t.Cloud.Compute.TargetPools.Insert(t.Cloud.Project, t.Cloud.Region, o).Do()
|
op, err := t.Cloud.Compute().TargetPools.Insert(t.Cloud.Project(), t.Cloud.Region(), o).Do()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("error creating TargetPool %q: %v", name, err)
|
return fmt.Errorf("error creating TargetPool %q: %v", name, err)
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue