Skip to content

Commit 21fd9d5

Browse files
authored
Merge pull request xanzy#1802 from Jitsusama/Add-DataDog-Service
Add DataDog Service Support
2 parents a492fa8 + 6d69851 commit 21fd9d5

File tree

3 files changed

+228
-0
lines changed

3 files changed

+228
-0
lines changed

examples/services.go

Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
//
2+
// Copyright 2023, Joel Gerber
3+
//
4+
// Licensed under the Apache License, Version 2.0 (the "License");
5+
// you may not use this file except in compliance with the License.
6+
// You may obtain a copy of the License at
7+
//
8+
// http://www.apache.org/licenses/LICENSE-2.0
9+
//
10+
// Unless required by applicable law or agreed to in writing, software
11+
// distributed under the License is distributed on an "AS IS" BASIS,
12+
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
// See the License for the specific language governing permissions and
14+
// limitations under the License.
15+
//
16+
17+
package main
18+
19+
import (
20+
"fmt"
21+
"log"
22+
23+
"github.com/xanzy/go-gitlab"
24+
)
25+
26+
func dataDogExample() {
27+
git, err := gitlab.NewClient("yourtokengoeshere")
28+
if err != nil {
29+
log.Fatal(err)
30+
}
31+
32+
// Create new DataDog integration
33+
opts := &gitlab.SetDataDogServiceOptions{
34+
APIKey: gitlab.String("testing"),
35+
ArchiveTraceEvents: gitlab.Bool(true),
36+
DataDogEnv: gitlab.String("sandbox"),
37+
DataDogService: gitlab.String("test"),
38+
DataDogSite: gitlab.String("datadoghq.com"),
39+
DataDogTags: gitlab.String("country:canada\nprovince:ontario"),
40+
}
41+
42+
_, err = git.Services.SetDataDogService(1, opts)
43+
if err != nil {
44+
log.Fatal(err)
45+
}
46+
47+
// Query the integration
48+
svc, _, err := git.Services.GetDataDogService(1)
49+
if err != nil {
50+
log.Fatal(err)
51+
}
52+
fmt.Printf(
53+
"api_url: %s, archive_trace_events: %v, datadog_env: %s, datadog_service: %s, datadog_site: %s, datadog_tags: %s",
54+
svc.Properties.APIURL, svc.Properties.ArchiveTraceEvents, svc.Properties.DataDogEnv,
55+
svc.Properties.DataDogService, svc.Properties.DataDogSite, svc.Properties.DataDogTags,
56+
)
57+
58+
// Delete the integration
59+
_, err = git.Services.DeleteDataDogService(1)
60+
if err != nil {
61+
log.Fatal(err)
62+
}
63+
}

services.go

Lines changed: 100 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -179,6 +179,106 @@ func (s *ServicesService) DeleteCustomIssueTrackerService(pid interface{}, optio
179179
return s.client.Do(req, nil)
180180
}
181181

182+
// DataDogService represents DataDog service settings.
183+
//
184+
// GitLab API docs:
185+
// https://docs.gitlab.com/ee/api/services.html#datadog
186+
type DataDogService struct {
187+
Service
188+
Properties *DataDogServiceProperties `json:"properties"`
189+
}
190+
191+
// DataDogServiceProperties represents DataDog specific properties.
192+
//
193+
// GitLab API docs:
194+
// https://docs.gitlab.com/ee/api/services.html#datadog
195+
type DataDogServiceProperties struct {
196+
APIURL string `url:"api_url,omitempty" json:"api_url,omitempty"`
197+
ArchiveTraceEvents bool `url:"archive_trace_events,omitempty" json:"archive_trace_events,omitempty"`
198+
DataDogEnv string `url:"datadog_env,omitempty" json:"datadog_env,omitempty"`
199+
DataDogService string `url:"datadog_service,omitempty" json:"datadog_service,omitempty"`
200+
DataDogSite string `url:"datadog_site,omitempty" json:"datadog_site,omitempty"`
201+
DataDogTags string `url:"datadog_tags,omitempty" json:"datadog_tags,omitempty"`
202+
}
203+
204+
// GetDataDogService gets DataDog service settings for a project.
205+
//
206+
// GitLab API docs:
207+
// https://docs.gitlab.com/ee/api/services.html#get-datadog-integration-settings
208+
func (s *ServicesService) GetDataDogService(pid interface{}, options ...RequestOptionFunc) (*DataDogService, *Response, error) {
209+
project, err := parseID(pid)
210+
if err != nil {
211+
return nil, nil, err
212+
}
213+
u := fmt.Sprintf("projects/%s/services/datadog", PathEscape(project))
214+
215+
req, err := s.client.NewRequest(http.MethodGet, u, nil, options)
216+
if err != nil {
217+
return nil, nil, err
218+
}
219+
220+
svc := new(DataDogService)
221+
resp, err := s.client.Do(req, svc)
222+
if err != nil {
223+
return nil, resp, err
224+
}
225+
226+
return svc, resp, nil
227+
}
228+
229+
// SetDataDogServiceOptions represents the available SetDataDogService()
230+
// options.
231+
//
232+
// GitLab API docs:
233+
// https://docs.gitlab.com/ee/api/services.html#createedit-datadog-integration
234+
type SetDataDogServiceOptions struct {
235+
APIKey *string `url:"api_key,omitempty" json:"api_key,omitempty"`
236+
APIURL *string `url:"api_url,omitempty" json:"api_url,omitempty"`
237+
ArchiveTraceEvents *bool `url:"archive_trace_events,omitempty" json:"archive_trace_events,omitempty"`
238+
DataDogEnv *string `url:"datadog_env,omitempty" json:"datadog_env,omitempty"`
239+
DataDogService *string `url:"datadog_service,omitempty" json:"datadog_service,omitempty"`
240+
DataDogSite *string `url:"datadog_site,omitempty" json:"datadog_site,omitempty"`
241+
DataDogTags *string `url:"datadog_tags,omitempty" json:"datadog_tags,omitempty"`
242+
}
243+
244+
// SetDataDogService sets DataDog service settings for a project.
245+
//
246+
// GitLab API docs:
247+
// https://docs.gitlab.com/ee/api/services.html#createedit-datadog-integration
248+
func (s *ServicesService) SetDataDogService(pid interface{}, opt *SetDataDogServiceOptions, options ...RequestOptionFunc) (*Response, error) {
249+
project, err := parseID(pid)
250+
if err != nil {
251+
return nil, err
252+
}
253+
u := fmt.Sprintf("projects/%s/services/datadog", PathEscape(project))
254+
255+
req, err := s.client.NewRequest(http.MethodPut, u, opt, options)
256+
if err != nil {
257+
return nil, err
258+
}
259+
260+
return s.client.Do(req, nil)
261+
}
262+
263+
// DeleteDataDogService deletes the DataDog service settings for a project.
264+
//
265+
// GitLab API docs:
266+
// https://docs.gitlab.com/ee/api/services.html#disable-datadog-integration
267+
func (s *ServicesService) DeleteDataDogService(pid interface{}, options ...RequestOptionFunc) (*Response, error) {
268+
project, err := parseID(pid)
269+
if err != nil {
270+
return nil, err
271+
}
272+
u := fmt.Sprintf("projects/%s/services/datadog", PathEscape(project))
273+
274+
req, err := s.client.NewRequest(http.MethodDelete, u, nil, options)
275+
if err != nil {
276+
return nil, err
277+
}
278+
279+
return s.client.Do(req, nil)
280+
}
281+
182282
// DiscordService represents Discord service settings.
183283
//
184284
// GitLab API docs:

services_test.go

Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -105,6 +105,71 @@ func TestDeleteCustomIssueTrackerService(t *testing.T) {
105105
}
106106
}
107107

108+
func TestGetDataDogService(t *testing.T) {
109+
mux, client := setup(t)
110+
111+
mux.HandleFunc("/api/v4/projects/1/services/datadog", func(w http.ResponseWriter, r *http.Request) {
112+
testMethod(t, r, http.MethodGet)
113+
fmt.Fprint(w, `{"id": 1, "active": true, "properties": {"datadog_site":"datadoghq.com", "api_url": "", "archive_trace_events": true, "datadog_service": "gitlab", "datadog_env": "production", "datadog_tags": "country=canada\nprovince=ontario"}}`)
114+
})
115+
want := &DataDogService{
116+
Service: Service{ID: 1, Active: true},
117+
Properties: &DataDogServiceProperties{
118+
APIURL: "",
119+
ArchiveTraceEvents: true,
120+
DataDogEnv: "production",
121+
DataDogService: "gitlab",
122+
DataDogSite: "datadoghq.com",
123+
DataDogTags: "country=canada\nprovince=ontario",
124+
},
125+
}
126+
127+
service, _, err := client.Services.GetDataDogService(1)
128+
if err != nil {
129+
t.Fatalf("Services.GetDataDogService returns an error: %v", err)
130+
}
131+
if !reflect.DeepEqual(want, service) {
132+
t.Errorf("Services.GetDataDogService returned %+v, want %+v", service, want)
133+
}
134+
}
135+
136+
func TestSetDataDogService(t *testing.T) {
137+
mux, client := setup(t)
138+
139+
mux.HandleFunc("/api/v4/projects/1/services/datadog", func(w http.ResponseWriter, r *http.Request) {
140+
testMethod(t, r, http.MethodPut)
141+
testBody(t, r, `{"api_key":"secret","api_url":"https://some-api.com","archive_trace_events":false,"datadog_env":"sandbox","datadog_service":"source-code","datadog_site":"datadoghq.eu","datadog_tags":"country=france"}`)
142+
})
143+
144+
opt := &SetDataDogServiceOptions{
145+
APIKey: String("secret"),
146+
APIURL: String("https://some-api.com"),
147+
ArchiveTraceEvents: Bool(false),
148+
DataDogEnv: String("sandbox"),
149+
DataDogService: String("source-code"),
150+
DataDogSite: String("datadoghq.eu"),
151+
DataDogTags: String("country=france"),
152+
}
153+
154+
_, err := client.Services.SetDataDogService(1, opt)
155+
if err != nil {
156+
t.Fatalf("Services.SetDataDogService returns an error: %v", err)
157+
}
158+
}
159+
160+
func TestDeleteDataDogService(t *testing.T) {
161+
mux, client := setup(t)
162+
163+
mux.HandleFunc("/api/v4/projects/1/services/datadog", func(w http.ResponseWriter, r *http.Request) {
164+
testMethod(t, r, http.MethodDelete)
165+
})
166+
167+
_, err := client.Services.DeleteDataDogService(1)
168+
if err != nil {
169+
t.Fatalf("Services.DeleteDataDogService returns an error: %v", err)
170+
}
171+
}
172+
108173
func TestGetDiscordService(t *testing.T) {
109174
mux, client := setup(t)
110175

0 commit comments

Comments
 (0)