Skip to content
This repository was archived by the owner on Aug 5, 2025. It is now read-only.

Commit 06016b1

Browse files
authored
Merge pull request #97 from OpsLevel/kr/cull_api_calls
Don't send an API call if there is nothing to actually update.
2 parents 3dc22c7 + 58f9c26 commit 06016b1

5 files changed

Lines changed: 148 additions & 7 deletions

File tree

.github/workflows/test.yml

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
name: Tests
2+
3+
on:
4+
push:
5+
branches: [ main ]
6+
pull_request:
7+
branches: [ main ]
8+
9+
jobs:
10+
11+
test:
12+
runs-on: ubuntu-latest
13+
steps:
14+
- uses: actions/checkout@v2
15+
16+
- name: Set up Go
17+
uses: actions/setup-go@v2
18+
with:
19+
go-version: 1.16
20+
21+
- name: Test
22+
env:
23+
CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }}
24+
run: |-
25+
cd ./src
26+
go test -race -coverprofile=coverage.txt -covermode=atomic -v ./...
27+
bash <(curl -s https://codecov.io/bash)
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
kind: Refactor
2+
body: Do not send a ServiceUpdate mutation if nothing changed about the data
3+
time: 2022-01-14T16:37:22.080214-06:00

src/common/client.go

Lines changed: 39 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,34 @@ func findService(client *opslevel.Client, registration ServiceRegistration) (*op
5050
return nil, false
5151
}
5252

53+
func serviceNeedsUpdate(input opslevel.ServiceUpdateInput, service *opslevel.Service) bool {
54+
if input.Name != "" && input.Name != service.Name {
55+
return true
56+
}
57+
if input.Product != "" && input.Product != service.Product {
58+
return true
59+
}
60+
if input.Description != "" && input.Description != service.Description {
61+
return true
62+
}
63+
if input.Language != "" && input.Language != service.Language {
64+
return true
65+
}
66+
if input.Framework != "" && input.Framework != service.Framework {
67+
return true
68+
}
69+
if input.Tier != "" && input.Tier != service.Tier.Alias {
70+
return true
71+
}
72+
if input.Lifecycle != "" && input.Lifecycle != service.Lifecycle.Alias {
73+
return true
74+
}
75+
if input.Owner != "" && input.Owner != service.Owner.Alias {
76+
return true
77+
}
78+
return false
79+
}
80+
5381
func createService(client *opslevel.Client, registration ServiceRegistration) (*opslevel.Service, error) {
5482
serviceCreateInput := opslevel.ServiceCreateInput{
5583
Name: registration.Name,
@@ -105,13 +133,17 @@ func updateService(client *opslevel.Client, registration ServiceRegistration, se
105133
} else if registration.Owner != "" {
106134
log.Warn().Msgf("[%s] Unable to find 'Team' with alias '%s'", service.Name, registration.Owner)
107135
}
108-
updatedService, updateServiceErr := client.UpdateService(updateServiceInput)
109-
if updateServiceErr != nil {
110-
log.Error().Msgf("[%s] Failed updating service\n\tREASON: %v", service.Name, updateServiceErr.Error())
111-
} else {
112-
if diff := cmp.Diff(service, updatedService); diff != "" {
113-
log.Info().Msgf("[%s] Updated Service - Diff:\n%s", service.Name, diff)
136+
if serviceNeedsUpdate(updateServiceInput, service) {
137+
updatedService, updateServiceErr := client.UpdateService(updateServiceInput)
138+
if updateServiceErr != nil {
139+
log.Error().Msgf("[%s] Failed updating service\n\tREASON: %v", service.Name, updateServiceErr.Error())
140+
} else {
141+
if diff := cmp.Diff(service, updatedService); diff != "" {
142+
log.Info().Msgf("[%s] Updated Service - Diff:\n%s", service.Name, diff)
143+
}
114144
}
145+
} else {
146+
log.Info().Msgf("[%s] No changes detected to fields - skipping update", service.Name)
115147
}
116148
}
117149

@@ -219,7 +251,7 @@ func handleRepositories(client *opslevel.Client, registration ServiceRegistratio
219251
repositoryCreate.Service = opslevel.IdentifierInput{Id: service.Id}
220252
_, err := client.CreateServiceRepository(repositoryCreate)
221253
if err != nil {
222-
log.Error().Msgf("[%s] Failed assigning repository '$s'\n\tREASON: %v", service.Name, repositoryAsString, err.Error())
254+
log.Error().Msgf("[%s] Failed assigning repository '%s'\n\tREASON: %v", service.Name, repositoryAsString, err.Error())
223255
} else {
224256
log.Info().Msgf("[%s] Attached repository '%s'", service.Name, repositoryAsString)
225257
}

src/common/client_test.go

Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,78 @@
1+
package common
2+
3+
import (
4+
"testing"
5+
6+
"github.com/opslevel/opslevel-go"
7+
"github.com/rocktavious/autopilot"
8+
)
9+
10+
func Test_ServiceNeedsUpdate_IsTrue_WhenInputDiffers(t *testing.T) {
11+
// Arrange
12+
service := opslevel.Service{
13+
ServiceId: opslevel.ServiceId{
14+
Id: opslevel.NewID("XXX"),
15+
},
16+
Name: "Test",
17+
Description: "Hello World",
18+
Language: "Python",
19+
Tier: opslevel.Tier{
20+
Alias: "tier_1",
21+
},
22+
}
23+
input1 := opslevel.ServiceUpdateInput{
24+
Name: "Test1",
25+
}
26+
input2 := opslevel.ServiceUpdateInput{
27+
Name: "Test",
28+
Language: "Python",
29+
Tier: "tier_2",
30+
}
31+
input3 := opslevel.ServiceUpdateInput{
32+
Name: "Test",
33+
Language: "Python",
34+
Owner: "platform",
35+
}
36+
// Act
37+
result1 := serviceNeedsUpdate(input1, &service)
38+
result2 := serviceNeedsUpdate(input2, &service)
39+
result3 := serviceNeedsUpdate(input3, &service)
40+
// Assert
41+
autopilot.Equals(t, true, result1)
42+
autopilot.Equals(t, true, result2)
43+
autopilot.Equals(t, true, result3)
44+
}
45+
46+
func Test_ServiceNeedsUpdate_IsFalse_WhenInputMatches(t *testing.T) {
47+
// Arrange
48+
service := opslevel.Service{
49+
ServiceId: opslevel.ServiceId{
50+
Id: opslevel.NewID("XXX"),
51+
},
52+
Name: "Test",
53+
Description: "Hello World",
54+
Language: "Python",
55+
Tier: opslevel.Tier{
56+
Alias: "tier_1",
57+
},
58+
}
59+
input1 := opslevel.ServiceUpdateInput{
60+
Id: "XXX",
61+
}
62+
input2 := opslevel.ServiceUpdateInput{
63+
Name: "Test",
64+
}
65+
input3 := opslevel.ServiceUpdateInput{
66+
Name: "Test",
67+
Language: "Python",
68+
Tier: "tier_1",
69+
}
70+
// Act
71+
result1 := serviceNeedsUpdate(input1, &service)
72+
result2 := serviceNeedsUpdate(input2, &service)
73+
result3 := serviceNeedsUpdate(input3, &service)
74+
// Assert
75+
autopilot.Equals(t, false, result1)
76+
autopilot.Equals(t, false, result2)
77+
autopilot.Equals(t, false, result3)
78+
}

src/go.mod

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ require (
99
github.com/google/go-cmp v0.5.5
1010
github.com/imdario/mergo v0.3.10 // indirect
1111
github.com/opslevel/opslevel-go v0.4.2
12+
github.com/rocktavious/autopilot v0.1.5 // indirect
1213
github.com/rs/zerolog v1.26.0
1314
github.com/spf13/cobra v1.2.1
1415
github.com/spf13/viper v1.8.1

0 commit comments

Comments
 (0)