mirror of
				https://github.com/onepanelio/onepanel.git
				synced 2025-10-31 08:46:20 +08:00 
			
		
		
		
	
		
			
				
	
	
		
			107 lines
		
	
	
		
			3.4 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			107 lines
		
	
	
		
			3.4 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
| package v1
 | |
| 
 | |
| import (
 | |
| 	"fmt"
 | |
| 	"github.com/onepanelio/core/pkg/util/ptr"
 | |
| 	"gopkg.in/yaml.v2"
 | |
| )
 | |
| 
 | |
| // +genclient
 | |
| // +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object
 | |
| 
 | |
| type ParameterOption struct {
 | |
| 	Name  string `json:"name" protobuf:"bytes,1,opt,name=name"`
 | |
| 	Value string `json:"value" protobuf:"bytes,2,opt,name=value"`
 | |
| }
 | |
| 
 | |
| type Parameter struct {
 | |
| 	Name        string             `json:"name" protobuf:"bytes,1,opt,name=name"`
 | |
| 	Value       *string            `json:"value,omitempty" protobuf:"bytes,2,opt,name=value"`
 | |
| 	Visibility  *string            `json:"visibility,omitempty"`
 | |
| 	Type        string             `json:"type,omitempty" protobuf:"bytes,3,opt,name=type"`
 | |
| 	DisplayName *string            `json:"displayName,omitempty" yaml:"displayName"`
 | |
| 	Hint        *string            `json:"hint,omitempty" protobuf:"bytes,5,opt,name=hint"`
 | |
| 	Options     []*ParameterOption `json:"options,omitempty" protobuf:"bytes,6,opt,name=options"`
 | |
| 	Required    bool               `json:"required,omitempty" protobuf:"bytes,7,opt,name=required"`
 | |
| }
 | |
| 
 | |
| // IsValidParameter returns nil if the parameter is valid or an error otherwise
 | |
| func IsValidParameter(parameter Parameter) error {
 | |
| 	if parameter.Visibility == nil {
 | |
| 		return nil
 | |
| 	}
 | |
| 
 | |
| 	visibility := *parameter.Visibility
 | |
| 	if visibility != "public" && visibility != "protected" && visibility != "internal" && visibility != "private" {
 | |
| 		return fmt.Errorf("invalid visibility '%v' for parameter '%v'", visibility, parameter.Name)
 | |
| 	}
 | |
| 
 | |
| 	return nil
 | |
| }
 | |
| 
 | |
| // IsValidParameters returns nil if all parameters are valid or an error otherwise
 | |
| func IsValidParameters(parameters []Parameter) error {
 | |
| 	for _, param := range parameters {
 | |
| 		if err := IsValidParameter(param); err != nil {
 | |
| 			return err
 | |
| 		}
 | |
| 	}
 | |
| 
 | |
| 	return nil
 | |
| }
 | |
| 
 | |
| // Arguments are the arguments in a manifest file.
 | |
| type Arguments struct {
 | |
| 	Parameters []Parameter `json:"parameters"`
 | |
| }
 | |
| 
 | |
| // WorkflowTemplateManifest is a client representation of a WorkflowTemplate
 | |
| // It is usually provided as YAML by a client and this struct helps to marshal/unmarshal it
 | |
| type WorkflowTemplateManifest struct {
 | |
| 	Arguments Arguments
 | |
| }
 | |
| 
 | |
| // WorkflowExecutionSpec is a client representation of a WorkflowExecution.
 | |
| // It is usually provided as YAML by a client and this struct helps to marshal/unmarshal it
 | |
| // This may be redundant with WorkflowTemplateManifest and should be looked at. # TODO
 | |
| type WorkflowExecutionSpec struct {
 | |
| 	Arguments Arguments
 | |
| }
 | |
| 
 | |
| // ParseParametersFromManifest takes a manifest and picks out the parameters and returns them as structs
 | |
| func ParseParametersFromManifest(manifest []byte) ([]Parameter, error) {
 | |
| 	manifestResult := &WorkflowTemplateManifest{
 | |
| 		Arguments: Arguments{},
 | |
| 	}
 | |
| 
 | |
| 	err := yaml.Unmarshal(manifest, manifestResult)
 | |
| 	if err != nil {
 | |
| 		return nil, err
 | |
| 	}
 | |
| 
 | |
| 	// Default parameter value
 | |
| 	for i := range manifestResult.Arguments.Parameters {
 | |
| 		parameter := &manifestResult.Arguments.Parameters[i]
 | |
| 		if parameter.Visibility == nil {
 | |
| 			parameter.Visibility = ptr.String("public")
 | |
| 		}
 | |
| 	}
 | |
| 
 | |
| 	if err := IsValidParameters(manifestResult.Arguments.Parameters); err != nil {
 | |
| 		return nil, err
 | |
| 	}
 | |
| 
 | |
| 	return manifestResult.Arguments.Parameters, nil
 | |
| }
 | |
| 
 | |
| // MapParametersByName returns a map where the parameter name is the key and the parameter is the value
 | |
| func MapParametersByName(parameters []Parameter) map[string]Parameter {
 | |
| 	result := make(map[string]Parameter)
 | |
| 
 | |
| 	for _, param := range parameters {
 | |
| 		result[param.Name] = param
 | |
| 	}
 | |
| 
 | |
| 	return result
 | |
| }
 | 
