-
Notifications
You must be signed in to change notification settings - Fork 24
/
helpers.go
155 lines (129 loc) 路 4.23 KB
/
helpers.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
145
146
147
148
149
150
151
152
153
154
155
package helpers
import (
"bytes"
"context"
"crypto/hmac"
"crypto/sha1"
"crypto/tls"
"encoding/hex"
"encoding/json"
"fmt"
"log"
"net/http"
"strings"
"text/template"
httpClient "github.com/taubyte/tau/clients/http"
"github.com/taubyte/go-interfaces/services/patrick"
httpAuthClient "github.com/taubyte/tau/clients/http/auth"
commonAuth "github.com/taubyte/tau/protocols/common"
)
var ac *httpAuthClient.Client
func RegisterTestProject(ctx context.Context, mockAuthURL string) (err error) {
// override ID of project generated so that it matches id in config
commonAuth.GetNewProjectID = func(args ...interface{}) string { return ProjectID }
ac, err = httpAuthClient.New(ctx, httpClient.URL(mockAuthURL), httpClient.Auth(GitToken), httpClient.Unsecure())
if err != nil {
return err
}
// Generate config, code repositories
err = RegisterTestRepositories(ctx, "", ConfigRepo, CodeRepo)
if err != nil {
return err
}
// Register project (
p := httpAuthClient.Project{Name: ProjectName}
// Register project with auth
err = p.Create(ac, fmt.Sprintf("%d", ConfigRepo.ID), fmt.Sprintf("%d", CodeRepo.ID))
if err != nil {
return err
}
return nil
}
func RegisterTestDomain(ctx context.Context, mockAuthURL string) (err error) {
ac, err = httpAuthClient.New(ctx, httpClient.URL(mockAuthURL), httpClient.Auth(GitToken), httpClient.Unsecure())
if err != nil {
return err
}
_, err = ac.RegisterDomain(TestFQDN, ProjectID)
return err
}
func RegisterTestRepositories(ctx context.Context, mockAuthURL string, repos ...Repository) (err error) {
if len(mockAuthURL) != 0 {
ac, err = httpAuthClient.New(ctx, httpClient.URL(mockAuthURL), httpClient.Auth(GitToken), httpClient.Unsecure())
if err != nil {
return err
}
}
for _, repo := range repos {
err = ac.RegisterRepository(fmt.Sprintf("%d", repo.ID))
if err != nil {
break
}
}
return err
}
func createStruct(payload []byte) (patrick.Meta, error) {
var newMeta patrick.Meta
// Unmarshal the needed json fields into the structure
err := json.Unmarshal(payload, &newMeta)
if err != nil {
return patrick.Meta{}, fmt.Errorf("failed unmarshalling payload into struct with error: %w", err)
}
return newMeta, nil
}
func PushJob(gitPayload []byte, patrickURL string, repo Repository) error {
client := CreateHttpClient()
url := fmt.Sprintf("%s/github/%s", patrickURL, ProjectID)
req, err := http.NewRequest("POST", url, bytes.NewReader(gitPayload))
if err != nil {
return fmt.Errorf("failed new request with error: %w", err)
}
// Add all headers
req.Header.Add("Accept", "*/*")
req.Header.Add("content-type", "application/json")
req.Header.Add("User-Agent", "GitHub-Hookshot/ae56f53")
req.Header.Add("X-GitHub-Delivery", "048aff50-b519-11ec-98cc-4f6fcbcf321f")
req.Header.Add("X-GitHub-Event", "push")
req.Header.Add("X-GitHub-Hook-ID", "350909926")
req.Header.Add("X-GitHub-Hook-Installation-Target-ID", fmt.Sprintf("%d", repo.ID)) // repoID
req.Header.Add("X-GitHub-Hook-Installation-Target-Type", "repository")
req.Header.Add("X-Hub-Signature", "sha1="+generateHMAC(gitPayload, "taubyte_secret"))
req.Header.Add("X-Hub-Signature-256", "sha256=")
_, err = client.Do(req)
if err != nil {
return fmt.Errorf("failed client Do with error: %w", err)
}
return nil
}
func CreateHttpClient() *http.Client {
tr := &http.Transport{
TLSClientConfig: &tls.Config{InsecureSkipVerify: true},
}
return &http.Client{Transport: tr}
}
func generateHMAC(body []byte, secret string) string {
mac := hmac.New(sha1.New, []byte(secret))
_, _ = mac.Write(body)
return hex.EncodeToString(mac.Sum(nil))
}
func MakeTemplate(id int, fullname string, branch string) ([]byte, error) {
if len(branch) == 0 {
branch = "master"
}
splitName := strings.Split(fullname, "/")
if len(splitName) != 2 {
return nil, fmt.Errorf("expected fullname to be `username/repo-name` got `%s`", fullname)
}
type repo struct {
ID int
Name, RepoName, Branch string
}
var repoInfo = &repo{ID: id, Name: splitName[0], RepoName: splitName[1], Branch: branch}
t := template.Must(template.New("repoInformation").Parse(string(TemplatePayload)))
var reader bytes.Buffer
err := t.Execute(&reader, repoInfo)
if err != nil {
log.Println("executing template:", err)
}
return reader.Bytes(), nil
}