github.com/ouraigua/jenkins-library@v0.0.0-20231028010029-fbeaf2f3aa9b/pkg/cnbutils/order.go (about)

     1  package cnbutils
     2  
     3  import (
     4  	"bytes"
     5  	"os"
     6  	"path/filepath"
     7  
     8  	"github.com/BurntSushi/toml"
     9  )
    10  
    11  const DefaultOrderPath = "/cnb/order.toml"
    12  
    13  type Order struct {
    14  	Order []OrderEntry `toml:"order"`
    15  	Utils BuildUtils   `toml:"-"`
    16  }
    17  
    18  type OrderEntry struct {
    19  	Group []BuildPackMetadata `toml:"group" json:"group"`
    20  }
    21  
    22  func (o Order) Save(path string) error {
    23  	var buf bytes.Buffer
    24  
    25  	err := toml.NewEncoder(&buf).Encode(o)
    26  	if err != nil {
    27  		return err
    28  	}
    29  
    30  	err = o.Utils.FileWrite(path, buf.Bytes(), 0644)
    31  	if err != nil {
    32  		return err
    33  	}
    34  
    35  	return nil
    36  }
    37  
    38  func loadExistingOrder(utils BuildUtils) (Order, error) {
    39  	order := Order{
    40  		Utils: utils,
    41  	}
    42  
    43  	orderReader, err := utils.Open(DefaultOrderPath)
    44  	if err != nil {
    45  		return Order{}, err
    46  	}
    47  	defer orderReader.Close()
    48  
    49  	_, err = toml.NewDecoder(orderReader).Decode(&order)
    50  	if err != nil {
    51  		return Order{}, err
    52  	}
    53  
    54  	return order, nil
    55  }
    56  
    57  func newOrder(bpacks []string, utils BuildUtils) (Order, error) {
    58  	buildpacksMeta, err := GetMetadata(bpacks, utils)
    59  	if err != nil {
    60  		return Order{}, err
    61  	}
    62  
    63  	return Order{
    64  		Utils: utils,
    65  		Order: []OrderEntry{{
    66  			Group: buildpacksMeta,
    67  		}},
    68  	}, nil
    69  }
    70  
    71  func CreateOrder(bpacks, preBpacks, postBpacks []string, dockerCreds string, utils BuildUtils) (Order, error) {
    72  	if dockerCreds != "" {
    73  		os.Setenv("DOCKER_CONFIG", filepath.Dir(dockerCreds))
    74  	}
    75  
    76  	var order Order
    77  	var err error
    78  	if len(bpacks) == 0 {
    79  		order, err = loadExistingOrder(utils)
    80  		if err != nil {
    81  			return Order{}, err
    82  		}
    83  	} else {
    84  		order, err = newOrder(bpacks, utils)
    85  		if err != nil {
    86  			return Order{}, err
    87  		}
    88  	}
    89  
    90  	for idx := range order.Order {
    91  		preMetadata, err := GetMetadata(preBpacks, utils)
    92  		if err != nil {
    93  			return Order{}, err
    94  		}
    95  
    96  		postMetadata, err := GetMetadata(postBpacks, utils)
    97  		if err != nil {
    98  			return Order{}, err
    99  		}
   100  
   101  		order.Order[idx].Group = append(preMetadata, order.Order[idx].Group...)
   102  		order.Order[idx].Group = append(order.Order[idx].Group, postMetadata...)
   103  	}
   104  
   105  	return order, nil
   106  }