github.com/caos/orbos@v1.5.14-0.20221103111702-e6cd0cea7ad4/internal/operator/boom/bundle/apply.go (about) 1 package bundle 2 3 import ( 4 "path/filepath" 5 6 "github.com/caos/orbos/internal/operator/boom/application" 7 "github.com/caos/orbos/internal/operator/boom/desired" 8 "github.com/caos/orbos/internal/utils/clientgo" 9 "github.com/caos/orbos/mntr" 10 ) 11 12 func applyWithCurrentState(monitor mntr.Monitor, currentResourceList []*clientgo.Resource, app application.Application, force bool) func(resultFilePath, namespace string) error { 13 14 logFields := map[string]interface{}{ 15 "command": "apply", 16 } 17 applyMonitor := monitor.WithFields(logFields) 18 19 resultFunc := func(resultFilePath, namespace string) error { 20 applyFunc := apply(monitor, app, force) 21 22 desiredResources, err := desired.Get(monitor, resultFilePath, namespace, app.GetName()) 23 if err != nil { 24 return err 25 } 26 27 if err := applyFunc(resultFilePath, namespace); err != nil { 28 return err 29 } 30 deleteResources := make([]*clientgo.Resource, 0) 31 for _, currentResource := range currentResourceList { 32 found := false 33 for _, desiredResource := range desiredResources { 34 apiVersion := filepath.Join(currentResource.Group, currentResource.Version) 35 if desiredResource.ApiVersion == apiVersion && 36 desiredResource.Kind == currentResource.Kind && 37 desiredResource.Metadata.Name == currentResource.Name && 38 (currentResource.Namespace == "" || desiredResource.Metadata.Namespace == currentResource.Namespace) { 39 found = true 40 break 41 } 42 } 43 if found == false { 44 otherAPI := false 45 for _, desiredResource := range desiredResources { 46 apiVersion := filepath.Join(currentResource.Group, currentResource.Version) 47 if apiVersion != desiredResource.ApiVersion && 48 currentResource.Kind == desiredResource.Kind && 49 currentResource.Name == desiredResource.Metadata.Name && 50 (currentResource.Namespace == "" || desiredResource.Metadata.Namespace == currentResource.Namespace) { 51 otherAPI = true 52 break 53 } 54 } 55 56 if !otherAPI { 57 deleteResources = append(deleteResources, currentResource) 58 } 59 } 60 } 61 applyMonitor.Debug("Resources to delete calculated") 62 63 if deleteResources != nil && len(deleteResources) > 0 { 64 for _, deleteResource := range deleteResources { 65 if err := clientgo.DeleteResource(monitor, deleteResource); err != nil { 66 return err 67 } 68 } 69 } 70 71 return nil 72 } 73 74 return resultFunc 75 } 76 77 func apply(monitor mntr.Monitor, app application.Application, force bool) func(resultFilePath, namespace string) error { 78 79 logFields := map[string]interface{}{ 80 "command": "apply", 81 } 82 applyMonitor := monitor.WithFields(logFields) 83 84 resultFunc := func(resultFilePath, namespace string) error { 85 return desired.Apply(applyMonitor, resultFilePath, namespace, app.GetName(), force) 86 } 87 88 return resultFunc 89 }