release.go 1.45 KB
Newer Older
songlinfeng's avatar
songlinfeng committed
1
2
3
package release

import (
4
	dcuTracker "dcu-container-toolkit/internal/dcu-tracker"
songlinfeng's avatar
songlinfeng committed
5
6
7
	"fmt"
	"os/user"

8
	"dcu-container-toolkit/internal/logger"
songlinfeng's avatar
songlinfeng committed
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29

	"github.com/urfave/cli/v2"
)

type command struct {
	logger logger.Interface
}

func NewCommand(logger logger.Interface) *cli.Command {
	c := command{
		logger: logger,
	}
	return c.build()
}

func (m command) build() *cli.Command {

	dcuTrackerReleaseCmd := cli.Command{
		Name:   "release",
		Hidden: true,
		Usage:  "Release DCUs used by a container",
30
		UsageText: `dcu-ctk dcu-tracker release [container_id]
songlinfeng's avatar
songlinfeng committed
31
32
33
34
35

	Arguments:
		container_id  container ID of the container

	Examples:
36
		dcu-ctk dcu-tracker release a4e19862b4e2a1b04a1f793f346d0411f4a0a3857578c526a25ac6c858168fd8`,
songlinfeng's avatar
songlinfeng committed
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
		Before: func(c *cli.Context) error {
			return validateGenOptions(c)
		},
		Action: func(c *cli.Context) error {
			return performAction(c)
		},
	}

	return &dcuTrackerReleaseCmd
}

func validateGenOptions(c *cli.Context) error {
	curUser, err := user.Current()
	if err != nil || curUser.Uid != "0" {
		return fmt.Errorf("Permission denied: Not running as root")
	}

	return nil
}

func performAction(c *cli.Context) error {
	if c.Args().Len() == 0 {
		return cli.ShowAppHelp(c)
	}

	dcuTracker, err := dcuTracker.New()
	if err != nil {
		return fmt.Errorf("Failed to create GPU tracker, Error: %v", err)
	}

	err = dcuTracker.ReleaseDCUs(c.Args().Get(0))
	if err != nil {
		return fmt.Errorf("Failed to release GPUs, Error: %v", err)
	}

	return nil
}