Skip to content

Commit

Permalink
Merge 19ff5d8 into eca7485
Browse files Browse the repository at this point in the history
  • Loading branch information
jnschaeffer committed Jan 10, 2020
2 parents eca7485 + 19ff5d8 commit eb806b1
Show file tree
Hide file tree
Showing 6 changed files with 443 additions and 44 deletions.
52 changes: 50 additions & 2 deletions cloud/linode/instances.go
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ import (
"strings"

"github.com/linode/linode-cloud-controller-manager/cloud"
"github.com/linode/linode-cloud-controller-manager/sentry"
"github.com/linode/linodego"
"github.com/pkg/errors"
v1 "k8s.io/api/core/v1"
Expand All @@ -24,25 +25,47 @@ func newInstances(client *linodego.Client) cloudprovider.Instances {
}

func (i *instances) NodeAddresses(ctx context.Context, name types.NodeName) ([]v1.NodeAddress, error) {
ctx = sentry.SetHubOnContext(ctx)
sentry.SetTag(ctx, "node_name", string(name))

linode, err := linodeByName(ctx, i.client, name)
if err != nil {
sentry.CaptureError(ctx, err)
return nil, err
}

addresses, err := i.nodeAddresses(ctx, linode)
if err != nil {
sentry.CaptureError(ctx, err)
return nil, err
}
return i.nodeAddresses(ctx, linode)

return addresses, nil
}

func (i *instances) NodeAddressesByProviderID(ctx context.Context, providerID string) ([]v1.NodeAddress, error) {
ctx = sentry.SetHubOnContext(ctx)
sentry.SetTag(ctx, "provider_id", providerID)

id, err := linodeIDFromProviderID(providerID)
if err != nil {
sentry.CaptureError(ctx, err)
return nil, err
}

linode, err := linodeByID(ctx, i.client, id)
if err != nil {
sentry.CaptureError(ctx, err)
return nil, err
}

addresses, err := i.nodeAddresses(ctx, linode)
if err != nil {
sentry.CaptureError(ctx, err)
return nil, err
}

return i.nodeAddresses(ctx, linode)
return addresses, nil
}

func (i *instances) nodeAddresses(ctx context.Context, linode *linodego.Instance) ([]v1.NodeAddress, error) {
Expand Down Expand Up @@ -72,28 +95,44 @@ func (i *instances) nodeAddresses(ctx context.Context, linode *linodego.Instance
}

func (i *instances) InstanceID(ctx context.Context, nodeName types.NodeName) (string, error) {
ctx = sentry.SetHubOnContext(ctx)
sentry.SetTag(ctx, "node_name", string(nodeName))

linode, err := linodeByName(ctx, i.client, nodeName)
if err != nil {
sentry.CaptureError(ctx, err)
return "", err
}
return strconv.Itoa(linode.ID), nil
}

func (i *instances) InstanceType(ctx context.Context, nodeName types.NodeName) (string, error) {
ctx = sentry.SetHubOnContext(ctx)
sentry.SetTag(ctx, "node_name", string(nodeName))

linode, err := linodeByName(ctx, i.client, nodeName)
if err != nil {
sentry.CaptureError(ctx, err)
return "", err
}
return linode.Type, nil
}

func (i *instances) InstanceTypeByProviderID(ctx context.Context, providerID string) (string, error) {
ctx = sentry.SetHubOnContext(ctx)
sentry.SetTag(ctx, "provider_id", providerID)

id, err := linodeIDFromProviderID(providerID)
if err != nil {
sentry.CaptureError(ctx, err)
return "", err
}

sentry.SetTag(ctx, "linode_id", id)

linode, err := linodeByID(ctx, i.client, id)
if err != nil {
sentry.CaptureError(ctx, err)
return "", err
}
return linode.Type, nil
Expand All @@ -108,15 +147,24 @@ func (i *instances) CurrentNodeName(_ context.Context, hostname string) (types.N
}

func (i *instances) InstanceExistsByProviderID(ctx context.Context, providerID string) (bool, error) {
ctx = sentry.SetHubOnContext(ctx)
sentry.SetTag(ctx, "provider_id", providerID)

id, err := linodeIDFromProviderID(providerID)
if err != nil {
sentry.CaptureError(ctx, err)
return false, err
}

sentry.SetTag(ctx, "linode_id", id)

_, err = linodeByID(ctx, i.client, id)
if err == nil {
return true, nil
}

// TODO: Should we capture an error here?

return false, nil
}

Expand Down
52 changes: 50 additions & 2 deletions cloud/linode/loadbalancers.go
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ import (
"k8s.io/client-go/rest"
"k8s.io/client-go/tools/clientcmd"

"github.com/linode/linode-cloud-controller-manager/sentry"
"github.com/linode/linodego"
"github.com/pkg/errors"
v1 "k8s.io/api/core/v1"
Expand Down Expand Up @@ -68,13 +69,22 @@ func newLoadbalancers(client *linodego.Client, zone string) cloudprovider.LoadBa
//
// GetLoadBalancer will not modify service.
func (l *loadbalancers) GetLoadBalancer(ctx context.Context, clusterName string, service *v1.Service) (*v1.LoadBalancerStatus, bool, error) {
ctx = sentry.SetHubOnContext(ctx)
sentry.SetTag(ctx, "cluster_name", clusterName)
sentry.SetTag(ctx, "service", service.Name)

lbName := cloudprovider.GetLoadBalancerName(service)

sentry.SetTag(ctx, "load_balancer_name", lbName)

lb, err := l.lbByName(ctx, l.client, lbName)
if err != nil {
if err == errLbNotFound {
return nil, false, nil
}

sentry.CaptureError(ctx, err)

return nil, false, err
}

Expand All @@ -93,14 +103,20 @@ func (l *loadbalancers) GetLoadBalancer(ctx context.Context, clusterName string,
//
// EnsureLoadBalancer will not modify service or nodes.
func (l *loadbalancers) EnsureLoadBalancer(ctx context.Context, clusterName string, service *v1.Service, nodes []*v1.Node) (*v1.LoadBalancerStatus, error) {
ctx = sentry.SetHubOnContext(ctx)
sentry.SetTag(ctx, "cluster_name", clusterName)
sentry.SetTag(ctx, "service", service.Name)

_, exists, err := l.GetLoadBalancer(ctx, clusterName, service)
if err != nil {
// No need to capture an error in Sentry here - GetLoadBalancer already does this
return nil, err
}

if !exists {
lb, err := l.buildLoadBalancerRequest(ctx, service, nodes)
if err != nil {
sentry.CaptureError(ctx, err)
return nil, err
}

Expand All @@ -116,11 +132,13 @@ func (l *loadbalancers) EnsureLoadBalancer(ctx context.Context, clusterName stri

err = l.UpdateLoadBalancer(ctx, clusterName, service, nodes)
if err != nil {
sentry.CaptureError(ctx, err)
return nil, err
}

lbStatus, _, err := l.GetLoadBalancer(ctx, clusterName, service)
if err != nil {
sentry.CaptureError(ctx, err)
return nil, err
}

Expand All @@ -130,10 +148,18 @@ func (l *loadbalancers) EnsureLoadBalancer(ctx context.Context, clusterName stri
// UpdateLoadBalancer updates the NodeBalancer to have configs that match the Service's ports
//nolint:funlen
func (l *loadbalancers) UpdateLoadBalancer(ctx context.Context, clusterName string, service *v1.Service, nodes []*v1.Node) error {
ctx = sentry.SetHubOnContext(ctx)
sentry.SetTag(ctx, "cluster_name", clusterName)
sentry.SetTag(ctx, "service", service.Name)

// Get the NodeBalancer
lbName := cloudprovider.GetLoadBalancerName(service)

sentry.SetTag(ctx, "load_balancer_name", lbName)

lb, err := l.lbByName(ctx, l.client, lbName)
if err != nil {
sentry.CaptureError(ctx, err)
return err
}

Expand All @@ -144,30 +170,36 @@ func (l *loadbalancers) UpdateLoadBalancer(ctx context.Context, clusterName stri

lb, err = l.client.UpdateNodeBalancer(ctx, lb.ID, update)
if err != nil {
sentry.CaptureError(ctx, err)
return err
}
}

// Get all of the NodeBalancer's configs
nbCfgs, err := l.client.ListNodeBalancerConfigs(ctx, lb.ID, nil)
if err != nil {
sentry.CaptureError(ctx, err)
return err
}

// Delete any configs for ports that have been removed from the Service
if err = l.deleteUnusedConfigs(ctx, nbCfgs, service.Spec.Ports); err != nil {
sentry.CaptureError(ctx, err)
return err
}

// Add or overwrite configs for each of the Service's ports
for _, port := range service.Spec.Ports {
if port.Protocol == v1.ProtocolUDP {
return fmt.Errorf("error updating NodeBalancer Config: ports with the UDP protocol are not supported")
err := fmt.Errorf("error updating NodeBalancer Config: ports with the UDP protocol are not supported")
sentry.CaptureError(ctx, err)
return err
}

// Construct a new config for this port
newNBCfg, err := l.buildNodeBalancerConfig(service, int(port.Port))
if err != nil {
sentry.CaptureError(ctx, err)
return err
}

Expand All @@ -193,6 +225,7 @@ func (l *loadbalancers) UpdateLoadBalancer(ctx context.Context, clusterName stri

currentNBCfg, err = l.client.CreateNodeBalancerConfig(ctx, lb.ID, createOpts)
if err != nil {
sentry.CaptureError(ctx, err)
return fmt.Errorf("[port %d] error creating NodeBalancer config: %v", int(port.Port), err)
}
}
Expand All @@ -201,6 +234,7 @@ func (l *loadbalancers) UpdateLoadBalancer(ctx context.Context, clusterName stri
rebuildOpts.Nodes = newNBNodes

if _, err = l.client.RebuildNodeBalancerConfig(ctx, lb.ID, currentNBCfg.ID, rebuildOpts); err != nil {
sentry.CaptureError(ctx, err)
return fmt.Errorf("[port %d] error rebuilding NodeBalancer config: %v", int(port.Port), err)
}
}
Expand Down Expand Up @@ -233,6 +267,10 @@ func (l *loadbalancers) deleteUnusedConfigs(ctx context.Context, nbConfigs []lin
//
// EnsureLoadBalancerDeleted will not modify service.
func (l *loadbalancers) EnsureLoadBalancerDeleted(ctx context.Context, clusterName string, service *v1.Service) error {
ctx = sentry.SetHubOnContext(ctx)
sentry.SetTag(ctx, "cluster_name", clusterName)
sentry.SetTag(ctx, "service", service.Name)

_, exists, err := l.GetLoadBalancer(ctx, clusterName, service)
if err != nil {
return err
Expand All @@ -242,11 +280,21 @@ func (l *loadbalancers) EnsureLoadBalancerDeleted(ctx context.Context, clusterNa
return nil
}
lbName := cloudprovider.GetLoadBalancerName(service)

sentry.SetTag(ctx, "load_balancer_name", lbName)

lb, err := l.lbByName(ctx, l.client, lbName)
if err != nil {
sentry.CaptureError(ctx, err)
return err
}

if err = l.client.DeleteNodeBalancer(ctx, lb.ID); err != nil {
sentry.CaptureError(ctx, err)
return err
}
return l.client.DeleteNodeBalancer(ctx, lb.ID)

return nil
}

// The returned error will be errLbNotFound if the load balancer does not exist.
Expand Down
29 changes: 10 additions & 19 deletions go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -8,46 +8,38 @@ require (
github.com/PuerkitoBio/purell v1.0.0 // indirect
github.com/PuerkitoBio/urlesc v0.0.0-20160726150825-5bd2802263f2 // indirect
github.com/beorn7/perks v0.0.0-20160229213445-3ac7bf7a47d1 // indirect
github.com/cockroachdb/cmux v0.0.0-20170110192607-30d10be49292 // indirect
github.com/coreos/bbolt v1.3.2 // indirect
github.com/coreos/etcd v3.2.24+incompatible // indirect
github.com/coreos/go-semver v0.0.0-20150304020126-568e959cd898 // indirect
github.com/coreos/etcd v3.3.18+incompatible // indirect
github.com/coreos/go-systemd v0.0.0-20161114122254-48702e0da86b // indirect
github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f // indirect
github.com/davecgh/go-spew v1.1.1 // indirect
github.com/dgrijalva/jwt-go v3.2.0+incompatible // indirect
github.com/dnaeon/go-vcr v1.0.1 // indirect
github.com/docker/distribution v0.0.0-20170726174610-edc3ab29cdff // indirect
github.com/elazarl/go-bindata-assetfs v0.0.0-20150624150248-3dcc96556217 // indirect
github.com/emicklei/go-restful v0.0.0-20170410110728-ff4f55a20633 // indirect
github.com/emicklei/go-restful-swagger12 v0.0.0-20170208215640-dcef7f557305 // indirect
github.com/evanphx/json-patch v0.0.0-20180908160633-36442dbdb585 // indirect
github.com/getsentry/sentry-go v0.4.0
github.com/go-openapi/jsonpointer v0.0.0-20160704185906-46af16f9f7b1 // indirect
github.com/go-openapi/jsonreference v0.0.0-20160704190145-13c6e3589ad9 // indirect
github.com/go-openapi/spec v0.0.0-20180213232550-1de3e0542de6 // indirect
github.com/go-openapi/swag v0.0.0-20170606142751-f3f9494671f9 // indirect
github.com/gogo/protobuf v0.0.0-20170330071051-c0656edd0d9e // indirect
github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b
github.com/golang/groupcache v0.0.0-20160516000752-02826c3e7903 // indirect
github.com/golang/protobuf v1.3.1 // indirect
github.com/google/btree v0.0.0-20160524151835-7d79101e329e // indirect
github.com/google/gofuzz v0.0.0-20161122191042-44d81051d367 // indirect
github.com/google/uuid v1.1.1 // indirect
github.com/googleapis/gnostic v0.0.0-20170729233727-0c5108395e2d // indirect
github.com/gregjones/httpcache v0.0.0-20170728041850-787624de3eb7 // indirect
github.com/grpc-ecosystem/go-grpc-middleware v1.1.0 // indirect
github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0 // indirect
github.com/grpc-ecosystem/grpc-gateway v1.8.1 // indirect
github.com/hashicorp/golang-lru v0.0.0-20160207214719-a0d98a5f2880 // indirect
github.com/imdario/mergo v0.3.5 // indirect
github.com/inconshreveable/mousetrap v1.0.0 // indirect
github.com/jonboulle/clockwork v0.1.0 // indirect
github.com/json-iterator/go v1.1.6 // indirect
github.com/linode/linodego v0.11.0
github.com/mailru/easyjson v0.0.0-20170624190925-2f5df55504eb // indirect
github.com/matttproud/golang_protobuf_extensions v1.0.1 // indirect
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect
github.com/modern-go/reflect2 v1.0.1 // indirect
github.com/natefinch/lumberjack v2.0.0+incompatible // indirect
github.com/onsi/ginkgo v1.7.0 // indirect
github.com/onsi/gomega v1.4.3 // indirect
github.com/opencontainers/go-digest v0.0.0-20170106003457-a6d0ee40d420 // indirect
github.com/pborman/uuid v0.0.0-20150603214016-ca53cad383ca // indirect
github.com/peterbourgon/diskv v2.0.1+incompatible // indirect
Expand All @@ -56,26 +48,25 @@ require (
github.com/prometheus/client_model v0.0.0-20150212101744-fa8ad6fec335 // indirect
github.com/prometheus/common v0.0.0-20170427095455-13ba4ddd0caa // indirect
github.com/prometheus/procfs v0.0.0-20170519190837-65c1f6f8f0fc // indirect
github.com/soheilhy/cmux v0.1.4 // indirect
github.com/spf13/afero v1.2.1 // indirect
github.com/spf13/cobra v0.0.3 // indirect
github.com/spf13/pflag v1.0.3
github.com/stretchr/testify v1.3.0 // indirect
github.com/ugorji/go v0.0.0-20170107133203-ded73eae5db7 // indirect
github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5 // indirect
github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2 // indirect
go.etcd.io/bbolt v1.3.2 // indirect
golang.org/x/crypto v0.0.0-20190422183909-d864b10871cd // indirect
go.uber.org/zap v1.13.0 // indirect
golang.org/x/time v0.0.0-20161028155119-f51c12702a4d // indirect
google.golang.org/appengine v1.3.0 // indirect
google.golang.org/appengine v1.4.0 // indirect
gopkg.in/inf.v0 v0.9.0 // indirect
gopkg.in/natefinch/lumberjack.v2 v2.0.0-20150622162204-20b71e5b60d7 // indirect
gopkg.in/square/go-jose.v2 v2.0.0-20180411045311-89060dee6a84 // indirect
gopkg.in/yaml.v1 v1.0.0-20140924161607-9f9df34309c0 // indirect
gopkg.in/yaml.v2 v2.2.2 // indirect
k8s.io/api v0.0.0-20180904230853-4e7be11eab3f
k8s.io/apiextensions-apiserver v0.0.0-20181115112708-6720c704a376 // indirect
k8s.io/apimachinery v0.0.0-20180621070125-103fd098999d
k8s.io/apiserver v0.0.0-20180910083620-386115dd78fd
k8s.io/client-go v8.0.0+incompatible
k8s.io/kube-openapi v0.0.0-20180711000925-0cf8f7e6ed1d // indirect
k8s.io/kubernetes v1.11.3
sigs.k8s.io/yaml v1.1.0 // indirect
)
Loading

0 comments on commit eb806b1

Please sign in to comment.