mirror of
				https://github.com/containers/podman.git
				synced 2025-10-31 18:08:51 +08:00 
			
		
		
		
	
		
			
				
	
	
		
			89 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			89 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
| // Package hook is the 0.1.0 hook configuration structure.
 | |
| package hook
 | |
| 
 | |
| import (
 | |
| 	"encoding/json"
 | |
| 	"errors"
 | |
| 	"strings"
 | |
| 
 | |
| 	current "github.com/containers/podman/v2/pkg/hooks/1.0.0"
 | |
| 	rspec "github.com/opencontainers/runtime-spec/specs-go"
 | |
| )
 | |
| 
 | |
| // Version is the hook configuration version defined in this package.
 | |
| const Version = "0.1.0"
 | |
| 
 | |
| // Hook is the hook configuration structure.
 | |
| type Hook struct {
 | |
| 	Hook      *string  `json:"hook"`
 | |
| 	Arguments []string `json:"arguments,omitempty"`
 | |
| 
 | |
| 	// https://github.com/cri-o/cri-o/pull/1235
 | |
| 	Stages []string `json:"stages"`
 | |
| 	Stage  []string `json:"stage"`
 | |
| 
 | |
| 	Cmds []string `json:"cmds,omitempty"`
 | |
| 	Cmd  []string `json:"cmd,omitempty"`
 | |
| 
 | |
| 	Annotations []string `json:"annotations,omitempty"`
 | |
| 	Annotation  []string `json:"annotation,omitempty"`
 | |
| 
 | |
| 	HasBindMounts *bool `json:"hasbindmounts,omitempty"`
 | |
| }
 | |
| 
 | |
| func Read(content []byte) (hook *current.Hook, err error) {
 | |
| 	var raw Hook
 | |
| 
 | |
| 	if err = json.Unmarshal(content, &raw); err != nil {
 | |
| 		return nil, err
 | |
| 	}
 | |
| 
 | |
| 	if raw.Hook == nil {
 | |
| 		return nil, errors.New("missing required property: hook")
 | |
| 	}
 | |
| 
 | |
| 	if raw.Stages == nil {
 | |
| 		raw.Stages = raw.Stage
 | |
| 	} else if raw.Stage != nil {
 | |
| 		return nil, errors.New("cannot set both 'stage' and 'stages'")
 | |
| 	}
 | |
| 	if raw.Stages == nil {
 | |
| 		return nil, errors.New("missing required property: stages")
 | |
| 	}
 | |
| 
 | |
| 	if raw.Cmds == nil {
 | |
| 		raw.Cmds = raw.Cmd
 | |
| 	} else if raw.Cmd != nil {
 | |
| 		return nil, errors.New("cannot set both 'cmd' and 'cmds'")
 | |
| 	}
 | |
| 
 | |
| 	if raw.Annotations == nil {
 | |
| 		raw.Annotations = raw.Annotation
 | |
| 	} else if raw.Annotation != nil {
 | |
| 		return nil, errors.New("cannot set both 'annotation' and 'annotations'")
 | |
| 	}
 | |
| 
 | |
| 	hook = ¤t.Hook{
 | |
| 		Version: current.Version,
 | |
| 		Hook: rspec.Hook{
 | |
| 			Path: *raw.Hook,
 | |
| 		},
 | |
| 		When: current.When{
 | |
| 			Commands:      raw.Cmds,
 | |
| 			HasBindMounts: raw.HasBindMounts,
 | |
| 			Or:            true,
 | |
| 		},
 | |
| 		Stages: raw.Stages,
 | |
| 	}
 | |
| 	if raw.Arguments != nil {
 | |
| 		hook.Hook.Args = append([]string{*raw.Hook}, raw.Arguments...)
 | |
| 	}
 | |
| 	if raw.Annotations != nil {
 | |
| 		hook.When.Annotations = map[string]string{
 | |
| 			".*": strings.Join(raw.Annotations, "|"),
 | |
| 		}
 | |
| 	}
 | |
| 
 | |
| 	return hook, nil
 | |
| }
 | 
