Skip to content

Commit

Permalink
Smaller function arguments.
Browse files Browse the repository at this point in the history
  • Loading branch information
Gerrit91 committed Jun 15, 2020
1 parent 87fd01c commit 6e39cbe
Show file tree
Hide file tree
Showing 4 changed files with 197 additions and 187 deletions.
9 changes: 7 additions & 2 deletions pkg/controller/infrastructure/actuator.go
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ import (

extensionsv1alpha1 "github.com/gardener/gardener/pkg/apis/extensions/v1alpha1"
gardenerkubernetes "github.com/gardener/gardener/pkg/client/kubernetes"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"

"github.com/go-logr/logr"

Expand Down Expand Up @@ -72,15 +73,15 @@ func (a *actuator) InjectConfig(config *rest.Config) error {
return nil
}

func (a *actuator) decodeInfrastructure(infrastructure *extensionsv1alpha1.Infrastructure) (*metalapi.InfrastructureConfig, *metalapi.InfrastructureStatus, error) {
func decodeInfrastructure(infrastructure *extensionsv1alpha1.Infrastructure, decoder runtime.Decoder) (*metalapi.InfrastructureConfig, *metalapi.InfrastructureStatus, error) {
infrastructureConfig, err := helper.InfrastructureConfigFromInfrastructure(infrastructure)
if err != nil {
return nil, nil, err
}

infrastructureStatus := &metalapi.InfrastructureStatus{}
if infrastructure.Status.ProviderStatus != nil {
if _, _, err := a.decoder.Decode(infrastructure.Status.ProviderStatus.Raw, nil, infrastructureStatus); err != nil {
if _, _, err := decoder.Decode(infrastructure.Status.ProviderStatus.Raw, nil, infrastructureStatus); err != nil {
return nil, nil, fmt.Errorf("could not decode infrastructure status: %+v", err)
}
}
Expand All @@ -91,6 +92,10 @@ func (a *actuator) decodeInfrastructure(infrastructure *extensionsv1alpha1.Infra
func updateProviderStatus(ctx context.Context, c client.Client, infrastructure *extensionsv1alpha1.Infrastructure, providerStatus *metalapi.InfrastructureStatus, nodeCIDR *string) error {
return extensionscontroller.TryUpdateStatus(ctx, retry.DefaultBackoff, c, infrastructure, func() error {
infrastructure.Status.ProviderStatus = &runtime.RawExtension{Object: &metalv1alpha1.InfrastructureStatus{
TypeMeta: metav1.TypeMeta{
APIVersion: metalv1alpha1.SchemeGroupVersion.String(),
Kind: "InfrastructureStatus",
},
Firewall: metalv1alpha1.FirewallStatus{
Succeeded: providerStatus.Firewall.Succeeded,
MachineID: providerStatus.Firewall.MachineID,
Expand Down
119 changes: 68 additions & 51 deletions pkg/controller/infrastructure/actuator_delete.go
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,8 @@ import (
"github.com/go-logr/logr"
"github.com/metal-stack/metal-lib/pkg/tag"
"github.com/pkg/errors"
"k8s.io/apimachinery/pkg/runtime"
"k8s.io/client-go/rest"
"sigs.k8s.io/controller-runtime/pkg/client"

metalapi "github.com/metal-stack/gardener-extension-provider-metal/pkg/apis/metal"
Expand All @@ -21,8 +23,35 @@ import (
extensionsv1alpha1 "github.com/gardener/gardener/pkg/apis/extensions/v1alpha1"
)

type firewallDeleter struct {
ctx context.Context
logger logr.Logger
c client.Client
infrastructure *extensionsv1alpha1.Infrastructure
infrastructureConfig *metalapi.InfrastructureConfig
providerStatus *metalapi.InfrastructureStatus
cluster *extensionscontroller.Cluster
mclient *metalgo.Driver
clusterID string
clusterTag string
machineID string
projectID string
}

func (a *actuator) Delete(ctx context.Context, infrastructure *extensionsv1alpha1.Infrastructure, cluster *extensionscontroller.Cluster) error {
internalInfrastructureConfig, internalInfrastructureStatus, err := a.decodeInfrastructure(infrastructure)
return Delete(ctx, a.logger, a.restConfig, a.client, a.decoder, infrastructure, cluster)
}

func Delete(
ctx context.Context,
logger logr.Logger,
restConfig *rest.Config,
c client.Client,
decoder runtime.Decoder,
infrastructure *extensionsv1alpha1.Infrastructure,
cluster *extensionscontroller.Cluster,
) error {
internalInfrastructureConfig, internalInfrastructureStatus, err := decodeInfrastructure(infrastructure, decoder)
if err != nil {
return err
}
Expand All @@ -37,66 +66,56 @@ func (a *actuator) Delete(ctx context.Context, infrastructure *extensionsv1alpha
return err
}

mclient, err := metalclient.NewClient(ctx, a.client, metalControlPlane.Endpoint, &infrastructure.Spec.SecretRef)
mclient, err := metalclient.NewClient(ctx, c, metalControlPlane.Endpoint, &infrastructure.Spec.SecretRef)
if err != nil {
return err
}

return delete(ctx,
a.logger,
a.client,
infrastructure,
internalInfrastructureConfig,
internalInfrastructureStatus,
cluster,
mclient,
)
deleter := &firewallDeleter{
logger: logger,
c: c,
infrastructure: infrastructure,
infrastructureConfig: internalInfrastructureConfig,
providerStatus: internalInfrastructureStatus,
cluster: cluster,
mclient: mclient,
clusterID: string(cluster.Shoot.GetUID()),
clusterTag: fmt.Sprintf("%s=%s", tag.ClusterID, string(cluster.Shoot.GetUID())),
machineID: decodeMachineID(internalInfrastructureStatus.Firewall.MachineID),
projectID: internalInfrastructureConfig.ProjectID,
}

return delete(ctx, deleter)
}

func delete(
ctx context.Context,
logger logr.Logger,
c client.Client,
infrastructure *extensionsv1alpha1.Infrastructure,
infrastructureConfig *metalapi.InfrastructureConfig,
providerStatus *metalapi.InfrastructureStatus,
cluster *extensionscontroller.Cluster,
mclient *metalgo.Driver,
) error {
var (
clusterID = string(cluster.Shoot.GetUID())
clusterTag = fmt.Sprintf("%s=%s", tag.ClusterID, clusterID)
machineID = decodeMachineID(providerStatus.Firewall.MachineID)
projectID = infrastructureConfig.ProjectID
)

if machineID != "" {
err := deleteFirewall(logger, machineID, projectID, clusterTag, mclient)
func delete(ctx context.Context, d *firewallDeleter) error {
if d.machineID != "" {
err := deleteFirewall(d.logger, d.machineID, d.projectID, d.clusterTag, d.mclient)
if err != nil {
return err
}

providerStatus.Firewall.MachineID = ""
err = updateProviderStatus(ctx, c, infrastructure, providerStatus, infrastructure.Status.NodesCIDR)
d.providerStatus.Firewall.MachineID = ""
err = updateProviderStatus(ctx, d.c, d.infrastructure, d.providerStatus, d.infrastructure.Status.NodesCIDR)
if err != nil {
return err
}

}

ipsToFree, ipsToUpdate, err := metalclient.GetEphemeralIPsFromCluster(mclient, projectID, clusterID)
ipsToFree, ipsToUpdate, err := metalclient.GetEphemeralIPsFromCluster(d.mclient, d.projectID, d.clusterID)
if err != nil {
logger.Error(err, "failed to query ephemeral cluster ips", "infrastructure", infrastructure.Name, "clusterID", clusterID)
d.logger.Error(err, "failed to query ephemeral cluster ips", "infrastructure", d.infrastructure.Name, "clusterID", d.clusterID)
return &controllererrors.RequeueAfterError{
Cause: err,
RequeueAfter: 30 * time.Second,
}
}

for _, ip := range ipsToFree {
_, err := mclient.IPFree(*ip.Ipaddress)
_, err := d.mclient.IPFree(*ip.Ipaddress)
if err != nil {
logger.Error(err, "failed to release ephemeral cluster ip", "infrastructure", infrastructure.Name, "ip", *ip.Ipaddress)
d.logger.Error(err, "failed to release ephemeral cluster ip", "infrastructure", d.infrastructure.Name, "ip", *ip.Ipaddress)
return &controllererrors.RequeueAfterError{
Cause: err,
RequeueAfter: 30 * time.Second,
Expand All @@ -105,30 +124,30 @@ func delete(
}

for _, ip := range ipsToUpdate {
err := metalclient.UpdateIPInCluster(mclient, ip, clusterID)
err := metalclient.UpdateIPInCluster(d.mclient, ip, d.clusterID)
if err != nil {
logger.Error(err, "failed to remove cluster tags from ip which is member of other clusters", "infrastructure", infrastructure.Name, "ip", *ip.Ipaddress)
d.logger.Error(err, "failed to remove cluster tags from ip which is member of other clusters", "infrastructure", d.infrastructure.Name, "ip", *ip.Ipaddress)
return &controllererrors.RequeueAfterError{
Cause: err,
RequeueAfter: 30 * time.Second,
}
}
}

if infrastructure.Status.NodesCIDR != nil {
privateNetworks, err := metalclient.GetPrivateNetworksFromNodeNetwork(mclient, projectID, *infrastructure.Status.NodesCIDR)
if d.infrastructure.Status.NodesCIDR != nil {
privateNetworks, err := metalclient.GetPrivateNetworksFromNodeNetwork(d.mclient, d.projectID, *d.infrastructure.Status.NodesCIDR)
if err != nil {
logger.Error(err, "failed to query private network", "infrastructure", infrastructure.Name, "nodeCIDR", *infrastructure.Status.NodesCIDR)
d.logger.Error(err, "failed to query private network", "infrastructure", d.infrastructure.Name, "nodeCIDR", *d.infrastructure.Status.NodesCIDR)
return &controllererrors.RequeueAfterError{
Cause: err,
RequeueAfter: 30 * time.Second,
}
}

for _, pn := range privateNetworks {
_, err := mclient.NetworkFree(*pn.ID)
_, err := d.mclient.NetworkFree(*pn.ID)
if err != nil {
logger.Error(err, "failed to release private network", "infrastructure", infrastructure.Name, "networkID", *pn.ID)
d.logger.Error(err, "failed to release private network", "infrastructure", d.infrastructure.Name, "networkID", *pn.ID)
return &controllererrors.RequeueAfterError{
Cause: err,
RequeueAfter: 30 * time.Second,
Expand All @@ -141,21 +160,19 @@ func delete(
}

func deleteFirewall(logger logr.Logger, machineID string, projectID string, clusterTag string, mclient *metalgo.Driver) error {
resp, err := mclient.FirewallFind(&metalgo.FirewallFindRequest{
MachineFindRequest: metalgo.MachineFindRequest{
ID: &machineID,
AllocationProject: &projectID,
Tags: []string{clusterTag},
},
})
firewalls, err := metalclient.FindClusterFirewalls(mclient, clusterTag, projectID)
if err != nil {
return &controllererrors.RequeueAfterError{
Cause: err,
RequeueAfter: 30 * time.Second,
}
}

if len(resp.Firewalls) > 0 {
if len(firewalls) > 0 {
if *firewalls[0].ID != machineID {
return fmt.Errorf("firewall from provider status does not match actual cluster firewall, can't do anything")
}

logger.Info("deleting firewall", "clusterTag", clusterTag, "machineid", machineID)
_, err = mclient.MachineDelete(machineID)
if err != nil {
Expand Down
Loading

0 comments on commit 6e39cbe

Please sign in to comment.