Skip to content

Commit 9431512

Browse files
authored
feat: add status pages and status page services (#131)
1 parent 1d63f11 commit 9431512

10 files changed

+656
-0
lines changed

checkly.go

+160
Original file line numberDiff line numberDiff line change
@@ -1393,6 +1393,166 @@ func (c *client) DeleteClientCertificate(
13931393
return nil
13941394
}
13951395

1396+
func (c *client) CreateStatusPage(
1397+
ctx context.Context,
1398+
page StatusPage,
1399+
) (*StatusPage, error) {
1400+
data, err := json.Marshal(page)
1401+
if err != nil {
1402+
return nil, err
1403+
}
1404+
status, res, err := c.apiCall(ctx, http.MethodPost, "status-pages", data)
1405+
if err != nil {
1406+
return nil, err
1407+
}
1408+
if status != http.StatusCreated {
1409+
return nil, fmt.Errorf("unexpected response status: %d, res: %q", status, res)
1410+
}
1411+
var result StatusPage
1412+
err = json.NewDecoder(strings.NewReader(res)).Decode(&result)
1413+
if err != nil {
1414+
return nil, fmt.Errorf("decoding error for data %s: %v", res, err)
1415+
}
1416+
return &result, nil
1417+
}
1418+
1419+
func (c *client) GetStatusPage(
1420+
ctx context.Context,
1421+
ID string,
1422+
) (*StatusPage, error) {
1423+
status, res, err := c.apiCall(ctx, http.MethodGet, fmt.Sprintf("status-pages/%s", ID), nil)
1424+
if err != nil {
1425+
return nil, err
1426+
}
1427+
if status != http.StatusOK {
1428+
return nil, fmt.Errorf("unexpected response status %d: %q", status, res)
1429+
}
1430+
var result StatusPage
1431+
err = json.NewDecoder(strings.NewReader(res)).Decode(&result)
1432+
if err != nil {
1433+
return nil, fmt.Errorf("decoding error for data %q: %v", res, err)
1434+
}
1435+
return &result, nil
1436+
}
1437+
1438+
func (c *client) UpdateStatusPage(
1439+
ctx context.Context,
1440+
ID string,
1441+
page StatusPage,
1442+
) (*StatusPage, error) {
1443+
data, err := json.Marshal(page)
1444+
if err != nil {
1445+
return nil, err
1446+
}
1447+
status, res, err := c.apiCall(ctx, http.MethodPut, fmt.Sprintf("status-pages/%s", ID), data)
1448+
if err != nil {
1449+
return nil, err
1450+
}
1451+
if status != http.StatusOK {
1452+
return nil, fmt.Errorf("unexpected response status: %d, res: %q", status, res)
1453+
}
1454+
var result StatusPage
1455+
err = json.NewDecoder(strings.NewReader(res)).Decode(&result)
1456+
if err != nil {
1457+
return nil, fmt.Errorf("decoding error for data %s: %v", res, err)
1458+
}
1459+
return &result, nil
1460+
}
1461+
1462+
func (c *client) DeleteStatusPage(
1463+
ctx context.Context,
1464+
ID string,
1465+
) error {
1466+
status, res, err := c.apiCall(ctx, http.MethodDelete, fmt.Sprintf("status-pages/%s", ID), nil)
1467+
if err != nil {
1468+
return err
1469+
}
1470+
if status != http.StatusNoContent {
1471+
return fmt.Errorf("unexpected response status %d: %q", status, res)
1472+
}
1473+
return nil
1474+
}
1475+
1476+
func (c *client) CreateStatusPageService(
1477+
ctx context.Context,
1478+
service StatusPageService,
1479+
) (*StatusPageService, error) {
1480+
data, err := json.Marshal(service)
1481+
if err != nil {
1482+
return nil, err
1483+
}
1484+
status, res, err := c.apiCall(ctx, http.MethodPost, "status-pages/services", data)
1485+
if err != nil {
1486+
return nil, err
1487+
}
1488+
if status != http.StatusCreated {
1489+
return nil, fmt.Errorf("unexpected response status: %d, res: %q", status, res)
1490+
}
1491+
var result StatusPageService
1492+
err = json.NewDecoder(strings.NewReader(res)).Decode(&result)
1493+
if err != nil {
1494+
return nil, fmt.Errorf("decoding error for data %s: %v", res, err)
1495+
}
1496+
return &result, nil
1497+
}
1498+
1499+
func (c *client) GetStatusPageService(
1500+
ctx context.Context,
1501+
ID string,
1502+
) (*StatusPageService, error) {
1503+
status, res, err := c.apiCall(ctx, http.MethodGet, fmt.Sprintf("status-pages/services/%s", ID), nil)
1504+
if err != nil {
1505+
return nil, err
1506+
}
1507+
if status != http.StatusOK {
1508+
return nil, fmt.Errorf("unexpected response status %d: %q", status, res)
1509+
}
1510+
var result StatusPageService
1511+
err = json.NewDecoder(strings.NewReader(res)).Decode(&result)
1512+
if err != nil {
1513+
return nil, fmt.Errorf("decoding error for data %q: %v", res, err)
1514+
}
1515+
return &result, nil
1516+
}
1517+
1518+
func (c *client) UpdateStatusPageService(
1519+
ctx context.Context,
1520+
ID string,
1521+
service StatusPageService,
1522+
) (*StatusPageService, error) {
1523+
data, err := json.Marshal(service)
1524+
if err != nil {
1525+
return nil, err
1526+
}
1527+
status, res, err := c.apiCall(ctx, http.MethodPut, fmt.Sprintf("status-pages/services/%s", ID), data)
1528+
if err != nil {
1529+
return nil, err
1530+
}
1531+
if status != http.StatusOK {
1532+
return nil, fmt.Errorf("unexpected response status: %d, res: %q", status, res)
1533+
}
1534+
var result StatusPageService
1535+
err = json.NewDecoder(strings.NewReader(res)).Decode(&result)
1536+
if err != nil {
1537+
return nil, fmt.Errorf("decoding error for data %s: %v", res, err)
1538+
}
1539+
return &result, nil
1540+
}
1541+
1542+
func (c *client) DeleteStatusPageService(
1543+
ctx context.Context,
1544+
ID string,
1545+
) error {
1546+
status, res, err := c.apiCall(ctx, http.MethodDelete, fmt.Sprintf("status-pages/services/%s", ID), nil)
1547+
if err != nil {
1548+
return err
1549+
}
1550+
if status != http.StatusNoContent {
1551+
return fmt.Errorf("unexpected response status %d: %q", status, res)
1552+
}
1553+
return nil
1554+
}
1555+
13961556
func payloadFromAlertChannel(ac AlertChannel) map[string]interface{} {
13971557
payload := map[string]interface{}{
13981558
"id": ac.ID,

checkly_integration_test.go

+130
Original file line numberDiff line numberDiff line change
@@ -419,3 +419,133 @@ func TestClientCertificateCRD(t *testing.T) {
419419
t.Fatalf("failed to delete client certificate: %v", err)
420420
}
421421
}
422+
423+
func TestStatusPageServiceCRUD(t *testing.T) {
424+
ctx := context.TODO()
425+
426+
client := setupClient(t)
427+
428+
pendingStatusPageService := checkly.StatusPageService{
429+
Name: "Foo service",
430+
}
431+
432+
createdStatusPageService, err := client.CreateStatusPageService(ctx, pendingStatusPageService)
433+
if err != nil {
434+
t.Fatalf("failed to create status page service: %v", err)
435+
}
436+
var didDelete bool
437+
defer func() {
438+
if !didDelete {
439+
_ = client.DeleteStatusPageService(ctx, createdStatusPageService.ID)
440+
}
441+
}()
442+
443+
readStatusPageService, err := client.GetStatusPageService(ctx, createdStatusPageService.ID)
444+
if err != nil {
445+
t.Fatalf("failed to get status page service: %v", err)
446+
}
447+
448+
if !cmp.Equal(createdStatusPageService, readStatusPageService) {
449+
t.Error(cmp.Diff(createdStatusPageService, readStatusPageService, ignoreStatusPageFields))
450+
}
451+
452+
updateStatusPageService := *createdStatusPageService
453+
updateStatusPageService.Name = "Bar service"
454+
455+
updatedStatusPageService, err := client.UpdateStatusPageService(ctx, createdStatusPageService.ID, updateStatusPageService)
456+
if err != nil {
457+
t.Fatalf("failed to update status page service: %v", err)
458+
}
459+
460+
if updatedStatusPageService.Name != "Bar service" {
461+
t.Fatalf("expected Name to change after update")
462+
}
463+
464+
didDelete = true
465+
err = client.DeleteStatusPageService(ctx, createdStatusPageService.ID)
466+
if err != nil {
467+
t.Fatalf("failed to delete status page service: %v", err)
468+
}
469+
}
470+
471+
func TestStatusPageCRUD(t *testing.T) {
472+
ctx := context.TODO()
473+
474+
client := setupClient(t)
475+
476+
pendingStatusPageService := checkly.StatusPageService{
477+
Name: "Foo service",
478+
}
479+
480+
createdStatusPageService, err := client.CreateStatusPageService(ctx, pendingStatusPageService)
481+
if err != nil {
482+
t.Fatalf("failed to create status page service: %v", err)
483+
}
484+
defer func() {
485+
_ = client.DeleteStatusPageService(ctx, createdStatusPageService.ID)
486+
}()
487+
488+
pendingStatusPage := checkly.StatusPage{
489+
Name: "Foo status page",
490+
URL: "foo-status-page",
491+
Cards: []checkly.StatusPageCard{
492+
{
493+
Name: "Foo card",
494+
Services: []checkly.StatusPageService{
495+
{
496+
ID: createdStatusPageService.ID,
497+
},
498+
},
499+
},
500+
},
501+
}
502+
503+
createdStatusPage, err := client.CreateStatusPage(ctx, pendingStatusPage)
504+
if err != nil {
505+
t.Fatalf("failed to create status page: %v", err)
506+
}
507+
var didDelete bool
508+
defer func() {
509+
if !didDelete {
510+
_ = client.DeleteStatusPage(ctx, createdStatusPage.ID)
511+
}
512+
}()
513+
514+
readStatusPage, err := client.GetStatusPage(ctx, createdStatusPage.ID)
515+
if err != nil {
516+
t.Fatalf("failed to get status page: %v", err)
517+
}
518+
519+
if len(readStatusPage.Cards) == 0 {
520+
t.Fatal("Expected status page to have cards")
521+
}
522+
523+
if len(readStatusPage.Cards[0].Services) == 0 {
524+
t.Fatal("Expected status page card to have services")
525+
}
526+
527+
// Fill out the name to allow cmp to work better.
528+
readStatusPage.Cards[0].Services[0].Name = createdStatusPageService.Name
529+
530+
if !cmp.Equal(createdStatusPage, readStatusPage) {
531+
t.Error(cmp.Diff(createdStatusPage, readStatusPage, ignoreStatusPageFields))
532+
}
533+
534+
updateStatusPage := *createdStatusPage
535+
updateStatusPage.Name = "Bar status page"
536+
537+
updatedStatusPage, err := client.UpdateStatusPage(ctx, createdStatusPage.ID, updateStatusPage)
538+
if err != nil {
539+
t.Fatalf("failed to update status page: %v", err)
540+
}
541+
542+
if updatedStatusPage.Name != "Bar status page" {
543+
t.Fatalf("expected Name to change after update")
544+
}
545+
546+
didDelete = true
547+
err = client.DeleteStatusPage(ctx, createdStatusPage.ID)
548+
if err != nil {
549+
t.Fatalf("failed to delete status page: %v", err)
550+
}
551+
}

0 commit comments

Comments
 (0)