github.com/caos/orbos@v1.5.14-0.20221103111702-e6cd0cea7ad4/internal/operator/orbiter/kinds/providers/gce/firewall.go (about) 1 package gce 2 3 import ( 4 "fmt" 5 "sort" 6 7 uuid "github.com/satori/go.uuid" 8 ) 9 10 var _ ensureFWFunc = queryFirewall 11 12 func queryFirewall(context *context, firewalls []*firewall) ([]func() error, []func() error, error) { 13 gceFirewalls, err := context.client.Firewalls. 14 List(context.projectID). 15 Filter(fmt.Sprintf(`network = "https://www.googleapis.com/compute/v1/%s"`, context.networkURL)). 16 Fields("items(network,name,description,allowed,targetTags,sourceRanges)"). 17 Do() 18 if err != nil { 19 return nil, nil, err 20 } 21 22 var ensure []func() error 23 createLoop: 24 for _, fw := range firewalls { 25 for _, gceFW := range gceFirewalls.Items { 26 if fw.gce.Description == gceFW.Description { 27 if gceFW.Allowed[0].Ports[0] != fw.gce.Allowed[0].Ports[0] || 28 !stringsEqual(gceFW.TargetTags, fw.gce.TargetTags) || 29 !stringsEqual(gceFW.SourceRanges, fw.gce.SourceRanges) { 30 ensure = append(ensure, operateFunc( 31 fw.log("Patching firewall", true), 32 computeOpCall(context.client.Firewalls.Patch(context.projectID, gceFW.Name, fw.gce).RequestId(uuid.NewV1().String()).Do), 33 toErrFunc(fw.log("Firewall patched", false)), 34 )) 35 } 36 continue createLoop 37 } 38 } 39 fw.gce.Name = newName() 40 ensure = append(ensure, operateFunc( 41 fw.log("Creating firewall", true), 42 computeOpCall(context.client.Firewalls. 43 Insert(context.projectID, fw.gce). 44 RequestId(uuid.NewV1().String()). 45 Do), 46 toErrFunc(fw.log("Firewall created", false)), 47 )) 48 } 49 50 var remove []func() error 51 removeLoop: 52 for _, gceTp := range gceFirewalls.Items { 53 for _, fw := range firewalls { 54 if gceTp.Description == fw.gce.Description { 55 continue removeLoop 56 } 57 } 58 remove = append(remove, removeResourceFunc(context.monitor, "firewall", gceTp.Name, context.client.Firewalls. 59 Delete(context.projectID, gceTp.Name). 60 RequestId(uuid.NewV1().String()). 61 Do)) 62 } 63 return ensure, remove, nil 64 } 65 66 func stringsEqual(first, second []string) bool { 67 if len(first) != len(second) { 68 return false 69 } 70 sort.Strings(first) 71 sort.Strings(second) 72 for idx, f := range first { 73 if second[idx] != f { 74 return false 75 } 76 } 77 return true 78 }