hooks.go 2.03 KB
Newer Older
songlinfeng's avatar
songlinfeng committed
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
/**
# Copyright (c) 2024, HCUOpt CORPORATION.  All rights reserved.
**/

package discover

import (
	"path/filepath"

	"tags.cncf.io/container-device-interface/pkg/cdi"
)

var _ Discover = (*Hook)(nil)

// Devices returns an empty list of devices for a Hook discoverer.
func (h Hook) Devices() ([]Device, error) {
	return nil, nil
}

// Mounts returns an empty list of mounts for a Hook discoverer.
func (h Hook) Mounts() ([]Mount, error) {
	return nil, nil
}

// Hooks allows the Hook type to also implement the Discoverer interface.
// It returns a single hook
func (h Hook) Hooks() ([]Hook, error) {
	return []Hook{h}, nil
}

func (h Hook) AdditionalGIDs() ([]uint32, error) {
	return []uint32{}, nil
}

// CreateSymlinkHook creates a hook which creates a symlink from link -> target.
func CreateSymlinkHook(dtkCDIHookPath string, links []string) Hook {
	if len(links) == 0 {
		return Hook{}
	}

	var args []string
	for _, link := range links {
		args = append(args, "--link", link)
	}
	return CreateDtkCDIHook(
		dtkCDIHookPath,
		"create-symlinks",
		args...,
	)
}

songlinfeng's avatar
songlinfeng committed
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
func CreateTrackHook(dtkCDIHookPath string, containerId string) Hook {
	return CreateDtkTrackHook(
		dtkCDIHookPath,
		"dcu-tracker",
		"release",
		containerId,
	)
}

func CreateDtkTrackHook(path string, s string, s2 string, id string) Hook {
	return Hook{
		Lifecycle: cdi.PoststopHook,
		Path:      path,
		Args:      []string{"dtk-ctk", s, s2, id},
	}
}

songlinfeng's avatar
songlinfeng committed
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
// CreateDtkCDIHook creates a hook which invokes the DTK Container CLI hook subcommand.
func CreateDtkCDIHook(dtkCDIHookPath string, hookName string, additionalArgs ...string) Hook {
	return cdiHook(dtkCDIHookPath).Create(hookName, additionalArgs...)
}

type cdiHook string

func (c cdiHook) Create(name string, args ...string) Hook {
	return Hook{
		Lifecycle: cdi.CreateContainerHook,
		Path:      string(c),
		Args:      append(c.requiredArgs(name), args...),
	}
}
func (c cdiHook) requiredArgs(name string) []string {
	base := filepath.Base(string(c))
	if base == "dtk-ctk" {
		return []string{base, "hook", name}
	}
	return []string{base, name}
}