forked from fediversity/fediversity
		
	factor out function wrapper to module function
This commit is contained in:
		
							parent
							
								
									c3027eb7d1
								
							
						
					
					
						commit
						b543bb1323
					
				
					 3 changed files with 53 additions and 21 deletions
				
			
		|  | @ -98,20 +98,18 @@ in | ||||||
|                     { |                     { | ||||||
|                       options.enable = lib.mkEnableOption "Hello in the shell"; |                       options.enable = lib.mkEnableOption "Hello in the shell"; | ||||||
|                     }; |                     }; | ||||||
|                   implementation = cfg: { |                   implementation = | ||||||
|                     input = cfg; |                     cfg: | ||||||
|                     output = lib.optionalAttrs cfg.enable { |                     lib.optionalAttrs cfg.enable { | ||||||
|                       resources.hello.login-shell.packages.hello = pkgs.hello; |                       resources.hello.login-shell.packages.hello = pkgs.hello; | ||||||
|                     }; |                     }; | ||||||
|                   }; |  | ||||||
|                 }; |                 }; | ||||||
|               environments.single-nixos-vm = |               environments.single-nixos-vm = | ||||||
|                 { config, ... }: |                 { config, ... }: | ||||||
|                 { |                 { | ||||||
|                   resources.operator-environment.login-shell.username = "operator"; |                   resources.operator-environment.login-shell.username = "operator"; | ||||||
|                   implementation = requests: { |                   implementation = requests: { | ||||||
|                     input = requests; |                     nixops4 = ( | ||||||
|                     output.nixops4 = |  | ||||||
|                       { providers, ... }: |                       { providers, ... }: | ||||||
|                       { |                       { | ||||||
|                         providers = { |                         providers = { | ||||||
|  | @ -130,7 +128,8 @@ in | ||||||
|                               ); |                               ); | ||||||
|                             }; |                             }; | ||||||
|                         }; |                         }; | ||||||
|                       }; |                       } | ||||||
|  |                     ); | ||||||
|                   }; |                   }; | ||||||
|                 }; |                 }; | ||||||
|             }; |             }; | ||||||
|  |  | ||||||
|  | @ -109,11 +109,11 @@ in | ||||||
|             }; |             }; | ||||||
|             resources = mkOption { |             resources = mkOption { | ||||||
|               description = "Compute resources required by an application"; |               description = "Compute resources required by an application"; | ||||||
|               type = functionTo application.config.config-mapping.output-type; |               type = application.config.config-mapping.function-type; | ||||||
|               readOnly = true; |               readOnly = true; | ||||||
|               default = input: (application.config.implementation input).output; |               default = application.config.config-mapping.apply; | ||||||
|             }; |             }; | ||||||
|             # TODO(@fricklerhandwerk): this needs a better name, it's just the type |             # TODO(@fricklerhandwerk): this needs a better name | ||||||
|             config-mapping = mkOption { |             config-mapping = mkOption { | ||||||
|               description = "Function type for the mapping from application configuration to required resources"; |               description = "Function type for the mapping from application configuration to required resources"; | ||||||
|               type = functionType; |               type = functionType; | ||||||
|  | @ -121,6 +121,7 @@ in | ||||||
|               default = { |               default = { | ||||||
|                 input-type = submodule application.config.module; |                 input-type = submodule application.config.module; | ||||||
|                 output-type = application-resources; |                 output-type = application-resources; | ||||||
|  |                 implementation = application.config.implementation; | ||||||
|               }; |               }; | ||||||
|             }; |             }; | ||||||
|           }; |           }; | ||||||
|  | @ -157,6 +158,25 @@ in | ||||||
|               default = { |               default = { | ||||||
|                 input-type = application-resources; |                 input-type = application-resources; | ||||||
|                 output-type = deployment; |                 output-type = deployment; | ||||||
|  |                 implementation = environment.config.implementation; | ||||||
|  |               }; | ||||||
|  |             }; | ||||||
|  |             config-mapping = mkOption { | ||||||
|  |               description = "Mapping from a configuration to a deployment"; | ||||||
|  |               type = submodule functionType; | ||||||
|  |               readOnly = true; | ||||||
|  |               default = { | ||||||
|  |                 input-type = config.configuration; | ||||||
|  |                 output-type = nixops4Deployment; | ||||||
|  |                 implementation = | ||||||
|  |                   cfg: | ||||||
|  |                   # TODO: check cfg.enable.true | ||||||
|  |                   let | ||||||
|  |                     required-resources = lib.mapAttrs ( | ||||||
|  |                       name: application-settings: config.applications.${name}.resources application-settings | ||||||
|  |                     ) cfg.applications; | ||||||
|  |                   in | ||||||
|  |                   environment.config.resource-mapping.apply required-resources; | ||||||
|               }; |               }; | ||||||
|             }; |             }; | ||||||
|             # TODO(@fricklerhandwerk): maybe this should be a separate thing such as `fediversity-setup`, |             # TODO(@fricklerhandwerk): maybe this should be a separate thing such as `fediversity-setup`, | ||||||
|  | @ -164,18 +184,9 @@ in | ||||||
|             # then the deployments can simply be the result of the function application baked into this module. |             # then the deployments can simply be the result of the function application baked into this module. | ||||||
|             deployment = mkOption { |             deployment = mkOption { | ||||||
|               description = "Generate a deployment from a configuration, by applying an environment's resource policies to the applications' resource mappings"; |               description = "Generate a deployment from a configuration, by applying an environment's resource policies to the applications' resource mappings"; | ||||||
|               type = functionTo (environment.config.resource-mapping.output-type); |               type = environment.config.config-mapping.function-type; | ||||||
|               readOnly = true; |               readOnly = true; | ||||||
|               default = |               default = environment.config.config-mapping.apply; | ||||||
|                 cfg: |  | ||||||
|                 # TODO: check cfg.enable.true |  | ||||||
|                 let |  | ||||||
|                   required-resources = lib.mapAttrs ( |  | ||||||
|                     name: application-settings: config.applications.${name}.resources application-settings |  | ||||||
|                   ) cfg.applications; |  | ||||||
|                 in |  | ||||||
|                 (environment.config.implementation required-resources).output; |  | ||||||
| 
 |  | ||||||
|             }; |             }; | ||||||
|           }; |           }; | ||||||
|         }) |         }) | ||||||
|  |  | ||||||
|  | @ -19,6 +19,11 @@ in | ||||||
|       type = optionType; |       type = optionType; | ||||||
|     }; |     }; | ||||||
|     function-type = mkOption { |     function-type = mkOption { | ||||||
|  |       type = optionType; | ||||||
|  |       readOnly = true; | ||||||
|  |       default = functionTo config.output-type; | ||||||
|  |     }; | ||||||
|  |     wrapper-type = mkOption { | ||||||
|       type = optionType; |       type = optionType; | ||||||
|       readOnly = true; |       readOnly = true; | ||||||
|       default = functionTo (submodule { |       default = functionTo (submodule { | ||||||
|  | @ -32,5 +37,22 @@ in | ||||||
|         }; |         }; | ||||||
|       }); |       }); | ||||||
|     }; |     }; | ||||||
|  |     implementation = mkOption { | ||||||
|  |       type = config.function-type; | ||||||
|  |       default = _: { }; | ||||||
|  |     }; | ||||||
|  |     wrapper = mkOption { | ||||||
|  |       type = config.wrapper-type; | ||||||
|  |       readOnly = true; | ||||||
|  |       default = input: fn: { | ||||||
|  |         inherit input; | ||||||
|  |         output = config.implementation fn.config.input; | ||||||
|  |       }; | ||||||
|  |     }; | ||||||
|  |     apply = mkOption { | ||||||
|  |       type = config.function-type; | ||||||
|  |       readOnly = true; | ||||||
|  |       default = input: (config.wrapper input).output; | ||||||
|  |     }; | ||||||
|   }; |   }; | ||||||
| } | } | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		
		Reference in a new issue