diff --git a/pkg/cloudprovider/providers/gce/gce_addresses.go b/pkg/cloudprovider/providers/gce/gce_addresses.go index 0a7b0d19974..f3bd9dea780 100644 --- a/pkg/cloudprovider/providers/gce/gce_addresses.go +++ b/pkg/cloudprovider/providers/gce/gce_addresses.go @@ -21,6 +21,7 @@ import ( "time" "github.com/golang/glog" + computealpha "google.golang.org/api/compute/v0.alpha" compute "google.golang.org/api/compute/v1" ) @@ -71,6 +72,16 @@ func (gce *GCECloud) ReserveRegionAddress(addr *compute.Address, region string) return gce.waitForRegionOp(op, region, mc) } +// ReserveAlphaRegionAddress creates an Alpha, regional address. +func (gce *GCECloud) ReserveAlphaRegionAddress(addr *computealpha.Address, region string) error { + mc := newAddressMetricContext("reserve", region) + op, err := gce.serviceAlpha.Addresses.Insert(gce.projectID, region, addr).Do() + if err != nil { + return mc.Observe(err) + } + return gce.waitForRegionOp(op, region, mc) +} + // DeleteRegionAddress deletes a region address by name. func (gce *GCECloud) DeleteRegionAddress(name, region string) error { mc := newAddressMetricContext("delete", region) @@ -88,6 +99,13 @@ func (gce *GCECloud) GetRegionAddress(name, region string) (*compute.Address, er return v, mc.Observe(err) } +// GetAlphaRegionAddress returns the Alpha, regional address by name. +func (gce *GCECloud) GetAlphaRegionAddress(name, region string) (*computealpha.Address, error) { + mc := newAddressMetricContext("get", region) + v, err := gce.serviceAlpha.Addresses.Get(gce.projectID, region, name).Do() + return v, mc.Observe(err) +} + // GetRegionAddressByIP returns the regional address matching the given IP // address. func (gce *GCECloud) GetRegionAddressByIP(region, ipAddress string) (*compute.Address, error) { diff --git a/pkg/cloudprovider/providers/gce/gce_addresses_fakes.go b/pkg/cloudprovider/providers/gce/gce_addresses_fakes.go index c114c1b66ca..ce4422a7fd5 100644 --- a/pkg/cloudprovider/providers/gce/gce_addresses_fakes.go +++ b/pkg/cloudprovider/providers/gce/gce_addresses_fakes.go @@ -20,6 +20,7 @@ import ( "fmt" "net/http" + computealpha "google.golang.org/api/compute/v0.alpha" compute "google.golang.org/api/compute/v1" "google.golang.org/api/googleapi" ) @@ -103,3 +104,11 @@ func (cas *FakeCloudAddressService) GetRegionAddressByIP(region, ipAddress strin } return nil, makeGoogleAPINotFoundError("") } + +func (cas *FakeCloudAddressService) GetAlphaRegionAddress(name, region string) (*computealpha.Address, error) { + return nil, fmt.Errorf("not implemented") +} + +func (cas *FakeCloudAddressService) ReserveAlphaRegionAddress(addr *computealpha.Address, region string) error { + return fmt.Errorf("not implemented") +} diff --git a/pkg/cloudprovider/providers/gce/gce_forwardingrule.go b/pkg/cloudprovider/providers/gce/gce_forwardingrule.go index 47c5f20c3b6..8a7110da6ba 100644 --- a/pkg/cloudprovider/providers/gce/gce_forwardingrule.go +++ b/pkg/cloudprovider/providers/gce/gce_forwardingrule.go @@ -19,6 +19,7 @@ package gce import ( "time" + computealpha "google.golang.org/api/compute/v0.alpha" compute "google.golang.org/api/compute/v1" ) @@ -85,6 +86,13 @@ func (gce *GCECloud) GetRegionForwardingRule(name, region string) (*compute.Forw return v, mc.Observe(err) } +// GetAlphaRegionForwardingRule returns the Alpha forwarding rule by name & region. +func (gce *GCECloud) GetAlphaRegionForwardingRule(name, region string) (*computealpha.ForwardingRule, error) { + mc := newForwardingRuleMetricContext("get", region) + v, err := gce.serviceAlpha.ForwardingRules.Get(gce.projectID, region, name).Do() + return v, mc.Observe(err) +} + // ListRegionForwardingRules lists all RegionalForwardingRules in the project & region. func (gce *GCECloud) ListRegionForwardingRules(region string) (*compute.ForwardingRuleList, error) { mc := newForwardingRuleMetricContext("list", region) @@ -105,6 +113,18 @@ func (gce *GCECloud) CreateRegionForwardingRule(rule *compute.ForwardingRule, re return gce.waitForRegionOp(op, region, mc) } +// CreateAlphaRegionForwardingRule creates and returns an Alpha +// forwarding fule in the given region. +func (gce *GCECloud) CreateAlphaRegionForwardingRule(rule *computealpha.ForwardingRule, region string) error { + mc := newForwardingRuleMetricContext("create", region) + op, err := gce.serviceAlpha.ForwardingRules.Insert(gce.projectID, region, rule).Do() + if err != nil { + return mc.Observe(err) + } + + return gce.waitForRegionOp(op, region, mc) +} + // DeleteRegionForwardingRule deletes the RegionalForwardingRule by name & region. func (gce *GCECloud) DeleteRegionForwardingRule(name, region string) error { mc := newForwardingRuleMetricContext("delete", region) diff --git a/pkg/cloudprovider/providers/gce/gce_interfaces.go b/pkg/cloudprovider/providers/gce/gce_interfaces.go index 43ce54afd5c..34fcdde4278 100644 --- a/pkg/cloudprovider/providers/gce/gce_interfaces.go +++ b/pkg/cloudprovider/providers/gce/gce_interfaces.go @@ -16,7 +16,10 @@ limitations under the License. package gce -import compute "google.golang.org/api/compute/v1" +import ( + computealpha "google.golang.org/api/compute/v0.alpha" + compute "google.golang.org/api/compute/v1" +) // CloudAddressService is an interface for managing addresses type CloudAddressService interface { @@ -25,4 +28,8 @@ type CloudAddressService interface { GetRegionAddressByIP(region, ipAddress string) (*compute.Address, error) // TODO: Mock `DeleteRegionAddress(name, region string) endpoint // TODO: Mock Global endpoints + + // Alpha API. + GetAlphaRegionAddress(name, region string) (*computealpha.Address, error) + ReserveAlphaRegionAddress(addr *computealpha.Address, region string) error }