44 lines
		
	
	
		
			1.4 KiB
		
	
	
	
		
			Nix
		
	
	
	
	
	
			
		
		
	
	
			44 lines
		
	
	
		
			1.4 KiB
		
	
	
	
		
			Nix
		
	
	
	
	
	
| { lib, ... }:
 | |
| 
 | |
| {
 | |
|   # Given a attrset of images and a function which generates an image spec,
 | |
|   # generates a set of containers (although this could in theory be used for
 | |
|   # other things... I'd like to see people try)
 | |
|   #
 | |
|   # container set must be in the below format
 | |
|   # { container-name = {image = "image-uri"; scale = n;}; }
 | |
|   # where image-uri gets passed in to the container-spec function as a custom
 | |
|   # parameter, and scale is an integer that generates the containers
 | |
|   #
 | |
|   # container-spec must be a function which accepts two parameter (the
 | |
|   # container name and image name) and ideally returns an oci-compliant
 | |
|   # container.
 | |
|   #
 | |
|   # args:
 | |
|   # containers: an AttrSet which specifies the imageUri and scale of each
 | |
|   #   container
 | |
|   # container-spec: a function which produces an oci-compliant container spec
 | |
|   #
 | |
|   # type:
 | |
|   # AttrSet -> (String -> AttrSet -> AttrSet) -> AttrSet
 | |
|   createTemplatedContainers =
 | |
|     containers: container-spec:
 | |
|     builtins.listToAttrs (
 | |
|       lib.flatten (
 | |
|         lib.mapAttrsToList (
 | |
|           name: value:
 | |
|           (map (
 | |
|             num:
 | |
|             let
 | |
|               container-name = "${name}-${toString num}";
 | |
|             in
 | |
|             {
 | |
|               name = container-name;
 | |
|               value = container-spec container-name value.image;
 | |
|             }
 | |
|           ) (lib.lists.range 1 value.scale))
 | |
|         ) containers
 | |
|       )
 | |
|     );
 | |
| }
 |