forked from sonatype-nexus-community/gonexus
/
scripts.go
144 lines (116 loc) · 3.39 KB
/
scripts.go
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
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
package nexusrm
import (
"bytes"
"encoding/json"
"fmt"
"net/http"
)
const (
restScript = "service/rest/v1/script"
restScriptRun = "service/rest/v1/script/%s/run"
)
// Script encapsulates a Repository Manager script
type Script struct {
Name string `json:"name"`
Content string `json:"content"`
Type string `json:"type"`
}
type runResponse struct {
Name string `json:"name"`
Result string `json:"result"`
}
// ScriptList lists all of the uploaded scripts in Repository Manager
func ScriptList(rm RM) ([]Script, error) {
doError := func(err error) error {
return fmt.Errorf("could not list scripts: %v", err)
}
body, _, err := rm.Get(restScript)
if err != nil {
return nil, doError(err)
}
scripts := make([]Script, 0)
if err = json.Unmarshal(body, &scripts); err != nil {
return nil, doError(err)
}
return scripts, nil
}
// ScriptGet returns the named script
func ScriptGet(rm RM, name string) (Script, error) {
doError := func(err error) error {
return fmt.Errorf("could not find script '%s': %v", name, err)
}
var script Script
endpoint := fmt.Sprintf("%s/%s", restScript, name)
body, _, err := rm.Get(endpoint)
if err != nil {
return script, doError(err)
}
if err = json.Unmarshal(body, &script); err != nil {
return script, doError(err)
}
return script, nil
}
// ScriptUpload uploads the given Script to Repository Manager
func ScriptUpload(rm RM, script Script) error {
doError := func(err error) error {
return fmt.Errorf("could not upload script '%s': %v", script.Name, err)
}
json, err := json.Marshal(script)
if err != nil {
return doError(err)
}
_, resp, err := rm.Post(restScript, bytes.NewBuffer(json))
if err != nil && resp.StatusCode != http.StatusNoContent {
return doError(err)
}
return nil
}
// ScriptUpdate update the contents of the given script
func ScriptUpdate(rm RM, script Script) error {
doError := func(err error) error {
return fmt.Errorf("could not update script '%s': %v", script.Name, err)
}
json, err := json.Marshal(script)
if err != nil {
return doError(err)
}
endpoint := fmt.Sprintf("%s/%s", restScript, script.Name)
_, resp, err := rm.Put(endpoint, bytes.NewBuffer(json))
if err != nil && resp.StatusCode != http.StatusNoContent {
return doError(err)
}
return nil
}
// ScriptRun executes the named Script
func ScriptRun(rm RM, name string, arguments []byte) (string, error) {
doError := func(err error) error {
return fmt.Errorf("could not run script '%s': %v", name, err)
}
endpoint := fmt.Sprintf(restScriptRun, name)
body, _, err := rm.Post(endpoint, bytes.NewBuffer(arguments)) // TODO: Better response handling
if err != nil {
return "", doError(err)
}
var resp runResponse
if err := json.Unmarshal(body, &resp); err != nil {
return "", doError(err)
}
return resp.Result, nil
}
// ScriptRunOnce takes the given Script, uploads it, executes it, and deletes it
func ScriptRunOnce(rm RM, script Script, arguments []byte) (string, error) {
if err := ScriptUpload(rm, script); err != nil {
return "", err
}
defer ScriptDelete(rm, script.Name)
return ScriptRun(rm, script.Name, arguments)
}
// ScriptDelete removes the name, uploaded script
func ScriptDelete(rm RM, name string) error {
endpoint := fmt.Sprintf("%s/%s", restScript, name)
resp, err := rm.Del(endpoint)
if err != nil && resp.StatusCode != http.StatusNoContent {
return fmt.Errorf("could not delete '%s': %v", name, err)
}
return nil
}