Skip to content

Commit a47441e

Browse files
authored
host group handle multiple policies (#28)
1 parent e22cb70 commit a47441e

File tree

2 files changed

+94
-181
lines changed

2 files changed

+94
-181
lines changed

docs/resources/host_group.md

+1-2
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ description: |-
55
This resource allows you to manage host groups in the CrowdStrike Falcon Platform.
66
API Scopes
77
The following API scopes are required:
8-
Host groups | Read & WriteDevice control policies | Read & WriteFirewall management | Read & WritePrevention policies | Read & WriteResponse policies | Read & WriteSensor update policies | Read & Write
8+
Host groups | Read & WriteFirewall management | Read & WritePrevention policies | Read & WriteResponse policies | Read & WriteSensor update policies | Read & Write
99
---
1010

1111
# crowdstrike_host_group (Resource)
@@ -17,7 +17,6 @@ This resource allows you to manage host groups in the CrowdStrike Falcon Platfor
1717
The following API scopes are required:
1818

1919
- Host groups | Read & Write
20-
- Device control policies | Read & Write
2120
- Firewall management | Read & Write
2221
- Prevention policies | Read & Write
2322
- Response policies | Read & Write

internal/provider/host_group_resource.go

+93-179
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@ import (
77
"time"
88

99
"github.com/crowdstrike/gofalcon/falcon/client"
10-
"github.com/crowdstrike/gofalcon/falcon/client/device_control_policies"
1110
"github.com/crowdstrike/gofalcon/falcon/client/firewall_policies"
1211
"github.com/crowdstrike/gofalcon/falcon/client/host_group"
1312
"github.com/crowdstrike/gofalcon/falcon/client/prevention_policies"
@@ -95,11 +94,6 @@ var apiScopes = []scopes.Scope{
9594
Read: true,
9695
Write: true,
9796
},
98-
{
99-
Name: "Device control policies",
100-
Read: true,
101-
Write: true,
102-
},
10397
{
10498
Name: "Firewall management",
10599
Read: true,
@@ -362,31 +356,15 @@ func (r *hostGroupResource) Delete(
362356
return
363357
}
364358

365-
// all assinged policies must be removed before we are able to delete the host group
366-
resp.Diagnostics.Append(r.purgeSensorUpdatePolicies(ctx, state.ID.ValueString())...)
367-
if resp.Diagnostics.HasError() {
368-
return
369-
}
370-
371-
resp.Diagnostics.Append(r.purgeUSBDeviceControlPolicies(ctx, state.ID.ValueString())...)
372-
if resp.Diagnostics.HasError() {
373-
return
374-
}
375-
376-
resp.Diagnostics.Append(r.purgeFirewallPolicies(ctx, state.ID.ValueString())...)
377-
if resp.Diagnostics.HasError() {
378-
return
379-
}
380-
381-
resp.Diagnostics.Append(r.purgePreventionPolicies(ctx, state.ID.ValueString())...)
382-
if resp.Diagnostics.HasError() {
383-
return
384-
}
359+
// some cxs may not have all modules so they will get a 403
360+
// storing errors in tempDiags and only throw them after a failed 409 delete
361+
var tempDiags diag.Diagnostics
385362

386-
resp.Diagnostics.Append(r.purgeResponsePolicies(ctx, state.ID.ValueString())...)
387-
if resp.Diagnostics.HasError() {
388-
return
389-
}
363+
// all assinged policies must be removed before we are able to delete the host group
364+
tempDiags.Append(r.purgeSensorUpdatePolicies(ctx, state.ID.ValueString())...)
365+
tempDiags.Append(r.purgeFirewallPolicies(ctx, state.ID.ValueString())...)
366+
tempDiags.Append(r.purgePreventionPolicies(ctx, state.ID.ValueString())...)
367+
tempDiags.Append(r.purgeResponsePolicies(ctx, state.ID.ValueString())...)
390368

391369
// removal of assigned policies return before the host group is ready to be deleted
392370
// adding a simple sleep.
@@ -401,9 +379,10 @@ func (r *hostGroupResource) Delete(
401379

402380
if err != nil {
403381
if strings.Contains(err.Error(), "409") {
382+
resp.Diagnostics.Append(tempDiags...)
404383
resp.Diagnostics.AddError(
405384
"Error deleting CrowdStrike host group",
406-
"Please remove all assigned policies (firewall policies, prevention policies, etc) and try again. "+err.Error(),
385+
"Please ensure you have the correct api scopes or remove all assigned policies manually (firewall policies, prevention policies, etc) and try again. "+err.Error(),
407386
)
408387
} else {
409388
resp.Diagnostics.AddError(
@@ -449,91 +428,32 @@ func (r *hostGroupResource) purgeSensorUpdatePolicies(
449428
}
450429

451430
policies := res.Payload.Resources
452-
453-
if len(policies) == 0 {
454-
return diags
455-
}
456-
457431
name := "group_id"
458-
_, err = r.client.SensorUpdatePolicies.PerformSensorUpdatePoliciesAction(
459-
&sensor_update_policies.PerformSensorUpdatePoliciesActionParams{
460-
Context: ctx,
461-
ActionName: "remove-host-group",
462-
Body: &models.MsaEntityActionRequestV2{
463-
ActionParameters: []*models.MsaspecActionParameter{
464-
{
465-
Name: &name,
466-
Value: &hostGroupID,
467-
},
468-
},
469-
Ids: policies,
470-
},
471-
},
472-
)
473-
474-
if err != nil {
475-
diags.AddError(
476-
"Error deleting CrowdStrike host group",
477-
"Unable to remove assigned sensor update policies "+err.Error(),
478-
)
479-
return diags
480-
}
481-
482-
return diags
483-
}
484-
485-
// purgeUSBDeviceControlPolicies removes all usb device control policies from a host group.
486-
func (r *hostGroupResource) purgeUSBDeviceControlPolicies(
487-
ctx context.Context,
488-
hostGroupID string,
489-
) diag.Diagnostics {
490-
var diags diag.Diagnostics
491-
492-
filter := fmt.Sprintf("groups:'%s'", hostGroupID)
493-
res, err := r.client.DeviceControlPolicies.QueryDeviceControlPolicies(
494-
&device_control_policies.QueryDeviceControlPoliciesParams{
495-
Context: ctx,
496-
Filter: &filter,
497-
},
498-
)
499-
500-
if err != nil {
501-
diags.AddError(
502-
"Error deleting CrowdStrike host group",
503-
"Unable to read assigned usb device control policies "+err.Error(),
504-
)
505-
return diags
506-
}
507-
508-
policies := res.Payload.Resources
509432

510-
if len(policies) == 0 {
511-
return diags
512-
}
513-
514-
name := "group_id"
515-
_, err = r.client.DeviceControlPolicies.PerformDeviceControlPoliciesAction(
516-
&device_control_policies.PerformDeviceControlPoliciesActionParams{
517-
Context: ctx,
518-
ActionName: "remove-host-group",
519-
Body: &models.MsaEntityActionRequestV2{
520-
ActionParameters: []*models.MsaspecActionParameter{
521-
{
522-
Name: &name,
523-
Value: &hostGroupID,
433+
for _, policy := range policies {
434+
_, err = r.client.SensorUpdatePolicies.PerformSensorUpdatePoliciesAction(
435+
&sensor_update_policies.PerformSensorUpdatePoliciesActionParams{
436+
Context: ctx,
437+
ActionName: "remove-host-group",
438+
Body: &models.MsaEntityActionRequestV2{
439+
ActionParameters: []*models.MsaspecActionParameter{
440+
{
441+
Name: &name,
442+
Value: &hostGroupID,
443+
},
524444
},
445+
Ids: []string{policy},
525446
},
526-
Ids: policies,
527447
},
528-
},
529-
)
530-
531-
if err != nil {
532-
diags.AddError(
533-
"Error deleting CrowdStrike host group",
534-
"Unable to remove assigned usb device control policies "+err.Error(),
535448
)
536-
return diags
449+
450+
if err != nil {
451+
diags.AddError(
452+
"Error deleting CrowdStrike host group",
453+
"Unable to remove assigned sensor update policies "+err.Error(),
454+
)
455+
return diags
456+
}
537457
}
538458

539459
return diags
@@ -563,34 +483,32 @@ func (r *hostGroupResource) purgePreventionPolicies(
563483
}
564484

565485
policies := res.Payload.Resources
566-
567-
if len(policies) == 0 {
568-
return diags
569-
}
570-
571486
name := "group_id"
572-
_, err = r.client.PreventionPolicies.PerformPreventionPoliciesAction(
573-
&prevention_policies.PerformPreventionPoliciesActionParams{
574-
Context: ctx,
575-
ActionName: "remove-host-group",
576-
Body: &models.MsaEntityActionRequestV2{
577-
ActionParameters: []*models.MsaspecActionParameter{
578-
{
579-
Name: &name,
580-
Value: &hostGroupID,
487+
488+
for _, policy := range policies {
489+
_, err = r.client.PreventionPolicies.PerformPreventionPoliciesAction(
490+
&prevention_policies.PerformPreventionPoliciesActionParams{
491+
Context: ctx,
492+
ActionName: "remove-host-group",
493+
Body: &models.MsaEntityActionRequestV2{
494+
ActionParameters: []*models.MsaspecActionParameter{
495+
{
496+
Name: &name,
497+
Value: &hostGroupID,
498+
},
581499
},
500+
Ids: []string{policy},
582501
},
583-
Ids: policies,
584502
},
585-
},
586-
)
587-
588-
if err != nil {
589-
diags.AddError(
590-
"Error deleting CrowdStrike host group",
591-
"Unable to remove assigned prevention policies "+err.Error(),
592503
)
593-
return diags
504+
505+
if err != nil {
506+
diags.AddError(
507+
"Error deleting CrowdStrike host group",
508+
"Unable to remove assigned prevention policies "+err.Error(),
509+
)
510+
return diags
511+
}
594512
}
595513

596514
return diags
@@ -620,34 +538,32 @@ func (r *hostGroupResource) purgeFirewallPolicies(
620538
}
621539

622540
policies := res.Payload.Resources
623-
624-
if len(policies) == 0 {
625-
return diags
626-
}
627-
628541
name := "group_id"
629-
_, err = r.client.FirewallPolicies.PerformFirewallPoliciesAction(
630-
&firewall_policies.PerformFirewallPoliciesActionParams{
631-
Context: ctx,
632-
ActionName: "remove-host-group",
633-
Body: &models.MsaEntityActionRequestV2{
634-
ActionParameters: []*models.MsaspecActionParameter{
635-
{
636-
Name: &name,
637-
Value: &hostGroupID,
542+
543+
for _, policy := range policies {
544+
_, err = r.client.FirewallPolicies.PerformFirewallPoliciesAction(
545+
&firewall_policies.PerformFirewallPoliciesActionParams{
546+
Context: ctx,
547+
ActionName: "remove-host-group",
548+
Body: &models.MsaEntityActionRequestV2{
549+
ActionParameters: []*models.MsaspecActionParameter{
550+
{
551+
Name: &name,
552+
Value: &hostGroupID,
553+
},
638554
},
555+
Ids: []string{policy},
639556
},
640-
Ids: policies,
641557
},
642-
},
643-
)
644-
645-
if err != nil {
646-
diags.AddError(
647-
"Error deleting CrowdStrike host group",
648-
"Unable to remove assigned firewall prevention policies "+err.Error(),
649558
)
650-
return diags
559+
560+
if err != nil {
561+
diags.AddError(
562+
"Error deleting CrowdStrike host group",
563+
"Unable to remove assigned firewall prevention policies "+err.Error(),
564+
)
565+
return diags
566+
}
651567
}
652568

653569
return diags
@@ -677,34 +593,32 @@ func (r *hostGroupResource) purgeResponsePolicies(
677593
}
678594

679595
policies := res.Payload.Resources
680-
681-
if len(policies) == 0 {
682-
return diags
683-
}
684-
685596
name := "group_id"
686-
_, err = r.client.ResponsePolicies.PerformRTResponsePoliciesAction(
687-
&response_policies.PerformRTResponsePoliciesActionParams{
688-
Context: ctx,
689-
ActionName: "remove-host-group",
690-
Body: &models.MsaEntityActionRequestV2{
691-
ActionParameters: []*models.MsaspecActionParameter{
692-
{
693-
Name: &name,
694-
Value: &hostGroupID,
597+
598+
for _, policy := range policies {
599+
_, err = r.client.ResponsePolicies.PerformRTResponsePoliciesAction(
600+
&response_policies.PerformRTResponsePoliciesActionParams{
601+
Context: ctx,
602+
ActionName: "remove-host-group",
603+
Body: &models.MsaEntityActionRequestV2{
604+
ActionParameters: []*models.MsaspecActionParameter{
605+
{
606+
Name: &name,
607+
Value: &hostGroupID,
608+
},
695609
},
610+
Ids: []string{policy},
696611
},
697-
Ids: policies,
698612
},
699-
},
700-
)
701-
702-
if err != nil {
703-
diags.AddError(
704-
"Error deleting CrowdStrike host group",
705-
"Unable to remove assigned response policies "+err.Error(),
706613
)
707-
return diags
614+
615+
if err != nil {
616+
diags.AddError(
617+
"Error deleting CrowdStrike host group",
618+
"Unable to remove assigned response policies "+err.Error(),
619+
)
620+
return diags
621+
}
708622
}
709623

710624
return diags

0 commit comments

Comments
 (0)