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  }