Skip to content

Commit 30c4507

Browse files
authored
Merge pull request #226 from /issues/225
fix: don't fail Helm chart check if cluster is unreachable
2 parents edbb5a2 + a7737e8 commit 30c4507

File tree

6 files changed

+54
-12
lines changed

6 files changed

+54
-12
lines changed

cmd/cofidectl/cmd/cluster/cluster.go

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -97,6 +97,7 @@ This command will delete a cluster from the Cofide configuration state.
9797

9898
type delOpts struct {
9999
trustZone string
100+
force bool
100101
}
101102

102103
func (c *ClusterCommand) getDelCommand() *cobra.Command {
@@ -111,17 +112,18 @@ func (c *ClusterCommand) getDelCommand() *cobra.Command {
111112
if err != nil {
112113
return err
113114
}
114-
return c.deleteCluster(cmd.Context(), args[0], opts.trustZone, kubeConfig)
115+
return c.deleteCluster(cmd.Context(), args[0], opts.trustZone, kubeConfig, opts.force)
115116
},
116117
}
117118
f := cmd.Flags()
118119
f.StringVar(&opts.trustZone, "trust-zone", "", "Name of the cluster's trust zone")
120+
f.BoolVar(&opts.force, "force", false, "Skip pre-delete checks")
119121

120122
cobra.CheckErr(cmd.MarkFlagRequired("trust-zone"))
121123
return cmd
122124
}
123125

124-
func (c *ClusterCommand) deleteCluster(ctx context.Context, name, trustZoneName, kubeConfig string) error {
126+
func (c *ClusterCommand) deleteCluster(ctx context.Context, name, trustZoneName, kubeConfig string, force bool) error {
125127
ds, err := c.cmdCtx.PluginManager.GetDataSource(ctx)
126128
if err != nil {
127129
return err
@@ -132,11 +134,13 @@ func (c *ClusterCommand) deleteCluster(ctx context.Context, name, trustZoneName,
132134
return err
133135
}
134136

135-
// Fail if the cluster is up.
136-
if deployed, err := helmprovider.IsClusterDeployed(ctx, cluster, kubeConfig); err != nil {
137-
return err
138-
} else if deployed {
139-
return fmt.Errorf("cluster %s in trust zone %s cannot be deleted while it is up", name, trustZoneName)
137+
if !force {
138+
// Fail if the cluster is reachable and SPIRE is deployed.
139+
if deployed, err := helmprovider.IsClusterDeployed(ctx, cluster, kubeConfig); err != nil {
140+
return err
141+
} else if deployed {
142+
return fmt.Errorf("cluster %s in trust zone %s cannot be deleted while it is up", name, trustZoneName)
143+
}
140144
}
141145

142146
return ds.DestroyCluster(name, trustZoneName)

cmd/cofidectl/cmd/federation/federation.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -147,6 +147,10 @@ func checkFederationStatus(ctx context.Context, ds datasource.DataSource, kubeCo
147147
return "", "", err
148148
}
149149

150+
if err := helm.IsClusterReachable(ctx, cluster, kubeConfig); err != nil {
151+
return "Unknown", err.Error(), nil
152+
}
153+
150154
if deployed, err := helm.IsClusterDeployed(ctx, cluster, kubeConfig); err != nil {
151155
return "", "", err
152156
} else if !deployed {

cmd/cofidectl/cmd/trustzone/trustzone.go

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -230,7 +230,12 @@ var trustZoneDelCmdDesc = `
230230
This command will delete a trust zone from the Cofide configuration state.
231231
`
232232

233+
type delOpts struct {
234+
force bool
235+
}
236+
233237
func (c *TrustZoneCommand) GetDelCommand() *cobra.Command {
238+
opts := &delOpts{}
234239
cmd := &cobra.Command{
235240
Use: "del [NAME]",
236241
Short: "Delete a trust zone",
@@ -247,21 +252,25 @@ func (c *TrustZoneCommand) GetDelCommand() *cobra.Command {
247252
return err
248253
}
249254

250-
return deleteTrustZone(cmd.Context(), args[0], ds, true, kubeConfig)
255+
return deleteTrustZone(cmd.Context(), args[0], ds, kubeConfig, opts.force)
251256
},
252257
}
258+
259+
f := cmd.Flags()
260+
f.BoolVar(&opts.force, "force", false, "Skip pre-delete checks")
261+
253262
return cmd
254263
}
255264

256-
func deleteTrustZone(ctx context.Context, name string, ds datasource.DataSource, checkDeployed bool, kubeConfig string) error {
265+
func deleteTrustZone(ctx context.Context, name string, ds datasource.DataSource, kubeConfig string, force bool) error {
257266
clusters, err := ds.ListClusters(name)
258267
if err != nil {
259268
return err
260269
}
261270

262271
// TODO: Add IsClusterDeployed to ProvisionPlugin interface and mock in tests.
263-
if checkDeployed {
264-
// Fail if any clusters in the trust zone are up.
272+
if !force {
273+
// Fail if any clusters in the trust zone are reachable and SPIRE is deployed.
265274
for _, cluster := range clusters {
266275
if deployed, err := helmprovider.IsClusterDeployed(ctx, cluster, kubeConfig); err != nil {
267276
return err

cmd/cofidectl/cmd/trustzone/trustzone_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -141,7 +141,7 @@ func TestTrustZoneCommand_deleteTrustZone(t *testing.T) {
141141
if tt.injectFailure {
142142
ds = &failingDS{LocalDataSource: ds.(*local.LocalDataSource)}
143143
}
144-
err := deleteTrustZone(context.Background(), tt.trustZoneName, ds, false, "")
144+
err := deleteTrustZone(context.Background(), tt.trustZoneName, ds, "", true)
145145
if tt.wantErr {
146146
require.Error(t, err)
147147
assert.ErrorContains(t, err, tt.wantErrMessage)

cmd/cofidectl/cmd/workload/workload.go

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import (
77
"context"
88
"errors"
99
"fmt"
10+
"log/slog"
1011
"os"
1112

1213
provisionpb "github.com/cofide/cofide-api-sdk/gen/go/proto/provision_plugin/v1alpha1"
@@ -203,6 +204,11 @@ func renderRegisteredWorkloads(ctx context.Context, ds datasource.DataSource, ku
203204
return err
204205
}
205206

207+
if err := helm.IsClusterReachable(ctx, cluster, kubeConfig); err != nil {
208+
slog.Warn("Cluster is unreachable", "cluster", cluster.GetName(), "error", err)
209+
continue
210+
}
211+
206212
if deployed, err := helm.IsClusterDeployed(ctx, cluster, kubeConfig); err != nil {
207213
return err
208214
} else if !deployed {
@@ -324,6 +330,11 @@ func renderUnregisteredWorkloads(ctx context.Context, ds datasource.DataSource,
324330
return err
325331
}
326332

333+
if err := helm.IsClusterReachable(ctx, cluster, kubeConfig); err != nil {
334+
slog.Warn("Cluster is unreachable", "cluster", cluster.GetName(), "error", err)
335+
continue
336+
}
337+
327338
deployed, err := helm.IsClusterDeployed(ctx, cluster, kubeConfig)
328339
if err != nil {
329340
return err

pkg/provider/helm/helm.go

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -241,6 +241,11 @@ func (h *HelmSPIREProvider) ExecuteUninstall(statusCh chan<- *provisionpb.Status
241241
return nil
242242
}
243243

244+
// CheckIfReachable returns no error if a Kubernetes cluster is reachable.
245+
func (h *HelmSPIREProvider) CheckIfReachable() error {
246+
return h.cfg.KubeClient.IsReachable()
247+
}
248+
244249
// CheckIfAlreadyInstalled returns true if the SPIRE chart has previously been installed.
245250
func (h *HelmSPIREProvider) CheckIfAlreadyInstalled() (bool, error) {
246251
return checkIfAlreadyInstalled(h.cfg, SPIREChartName)
@@ -414,6 +419,15 @@ func checkIfAlreadyInstalled(cfg *action.Configuration, chartName string) (bool,
414419
return len(ledger) > 0, nil
415420
}
416421

422+
// IsClusterDeployed returns whether a Kubernetes cluster is reachable.
423+
func IsClusterReachable(ctx context.Context, cluster *clusterpb.Cluster, kubeConfig string) error {
424+
prov, err := NewHelmSPIREProvider(ctx, cluster, nil, nil, kubeConfig)
425+
if err != nil {
426+
return err
427+
}
428+
return prov.CheckIfReachable()
429+
}
430+
417431
// IsClusterDeployed returns whether a cluster has been deployed, i.e. whether a SPIRE Helm release has been installed.
418432
func IsClusterDeployed(ctx context.Context, cluster *clusterpb.Cluster, kubeConfig string) (bool, error) {
419433
prov, err := NewHelmSPIREProvider(ctx, cluster, nil, nil, kubeConfig)

0 commit comments

Comments
 (0)