Skip to content

Commit ede653f

Browse files
authored
Merge pull request #1238 from cloudskiff/add_build_flag_to_disable_telemetry
Add a global switch to disable third party
2 parents cbc6fd7 + c460a9e commit ede653f

File tree

9 files changed

+133
-52
lines changed

9 files changed

+133
-52
lines changed

build/build.go

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,23 @@ package build
22

33
var env = "dev"
44

5+
// This flag could be switched to false while building to create a binary without third party network calls
6+
// That mean that following services will be disabled:
7+
// - telemetry
8+
// - version check
9+
var enableUsageReporting = "true"
10+
511
type BuildInterface interface {
612
IsRelease() bool
13+
IsUsageReportingEnabled() bool
714
}
815

916
type Build struct{}
1017

1118
func (b Build) IsRelease() bool {
1219
return env == "release"
1320
}
21+
22+
func (b Build) IsUsageReportingEnabled() bool {
23+
return enableUsageReporting == "true"
24+
}

main.go

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,8 +31,14 @@ func run() int {
3131

3232
config.Init()
3333
logger.Init()
34+
build := build.Build{}
35+
logrus.WithFields(logrus.Fields{
36+
"isRelease": fmt.Sprintf("%t", build.IsRelease()),
37+
"isUsageReportingEnabled": fmt.Sprintf("%t", build.IsUsageReportingEnabled()),
38+
"version": version.Current(),
39+
}).Debug("Build info")
3440

35-
driftctlCmd := cmd.NewDriftctlCmd(build.Build{})
41+
driftctlCmd := cmd.NewDriftctlCmd(build)
3642

3743
checkVersion := driftctlCmd.ShouldCheckVersion()
3844
latestVersionChan := make(chan string)

pkg/cmd/driftctl.go

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -62,8 +62,10 @@ func NewDriftctlCmd(build build.BuildInterface) *DriftctlCmd {
6262
cmd.SetUsageTemplate(usageTemplate)
6363

6464
cmd.PersistentFlags().BoolP("help", "h", false, "Display help for command")
65-
cmd.PersistentFlags().BoolP("no-version-check", "", false, "Disable the version check")
66-
cmd.PersistentFlags().BoolP("disable-telemetry", "", false, "Disable telemetry")
65+
if cmd.build.IsUsageReportingEnabled() {
66+
cmd.PersistentFlags().BoolP("no-version-check", "", false, "Disable the version check")
67+
cmd.PersistentFlags().BoolP("disable-telemetry", "", false, "Disable telemetry")
68+
}
6769
cmd.PersistentFlags().BoolP("send-crash-report", "", false, "Enable error reporting. Crash data will be sent to us via Sentry.\nWARNING: may leak sensitive data (please read the documentation for more details)\nThis flag should be used only if an error occurs during execution")
6870

6971
cmd.AddCommand(NewScanCmd(&pkg.ScanOptions{}))
@@ -87,7 +89,7 @@ func (driftctlCmd DriftctlCmd) ShouldCheckVersion() bool {
8789
hasVersionCmd := contains(os.Args[1:], "version")
8890
hasCompletionCmd := contains(os.Args[1:], "completion")
8991
isHelp := contains(os.Args[1:], "help") || contains(os.Args[1:], "--help") || contains(os.Args[1:], "-h")
90-
return driftctlCmd.build.IsRelease() && !hasVersionCmd && !hasCompletionCmd && !noVersionCheckVal && !isHelp && !noVersionCheckEnv
92+
return driftctlCmd.build.IsRelease() && driftctlCmd.build.IsUsageReportingEnabled() && !hasVersionCmd && !hasCompletionCmd && !noVersionCheckVal && !isHelp && !noVersionCheckEnv
9193
}
9294

9395
func IsReportingEnabled(cmd *cobra.Command) bool {

pkg/cmd/driftctl_test.go

Lines changed: 62 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -165,73 +165,91 @@ func TestDriftctlCmd_Invalid(t *testing.T) {
165165

166166
func TestDriftctlCmd_ShouldCheckVersion(t *testing.T) {
167167
cases := []struct {
168-
Name string
169-
IsRelease bool
170-
args []string
171-
env map[string]string
172-
expected bool
168+
Name string
169+
IsRelease bool
170+
UsageReport bool
171+
args []string
172+
env map[string]string
173+
expected bool
173174
}{
174175
{
175-
Name: "When we are in release mode and no args, should check for update",
176-
IsRelease: true,
177-
args: []string{""},
178-
expected: true,
176+
Name: "When we are in release mode and no args, should check for update",
177+
IsRelease: true,
178+
UsageReport: true,
179+
args: []string{""},
180+
expected: true,
179181
},
180182
{
181-
Name: "Don't check for update for version cmd",
182-
IsRelease: true,
183-
args: []string{"version"},
184-
expected: false,
183+
Name: "Do not check for update when usage reporting is disabled",
184+
IsRelease: true,
185+
UsageReport: false,
186+
args: []string{""},
187+
expected: false,
185188
},
186189
{
187-
Name: "Don't check for update for help cmd",
188-
IsRelease: true,
189-
args: []string{"help"},
190-
expected: false,
190+
Name: "Don't check for update for version cmd",
191+
IsRelease: true,
192+
UsageReport: true,
193+
args: []string{"version"},
194+
expected: false,
191195
},
192196
{
193-
Name: "Don't check for update for cmd --help",
194-
IsRelease: true,
195-
args: []string{"scan", "--help"},
196-
expected: false,
197+
Name: "Don't check for update for help cmd",
198+
IsRelease: true,
199+
UsageReport: true,
200+
args: []string{"help"},
201+
expected: false,
197202
},
198203
{
199-
Name: "Don't check for update for cmd -h",
200-
IsRelease: true,
201-
args: []string{"scan", "-h"},
202-
expected: false,
204+
Name: "Don't check for update for cmd --help",
205+
IsRelease: true,
206+
UsageReport: true,
207+
args: []string{"scan", "--help"},
208+
expected: false,
203209
},
204210
{
205-
Name: "Don't check for update when no check flag present",
206-
IsRelease: true,
207-
args: []string{"--no-version-check"},
208-
expected: false,
211+
Name: "Don't check for update for cmd -h",
212+
IsRelease: true,
213+
UsageReport: true,
214+
args: []string{"scan", "-h"},
215+
expected: false,
209216
},
210217
{
211-
Name: "Don't check for update in dev mode",
212-
IsRelease: false,
213-
args: []string{""},
214-
expected: false,
218+
Name: "Don't check for update when no check flag present",
219+
IsRelease: true,
220+
UsageReport: true,
221+
args: []string{"--no-version-check"},
222+
expected: false,
215223
},
216224
{
217-
Name: "Don't check for update when env DCTL_NO_VERSION_CHECK set",
218-
IsRelease: true,
225+
Name: "Don't check for update in dev mode",
226+
IsRelease: false,
227+
UsageReport: true,
228+
args: []string{""},
229+
expected: false,
230+
},
231+
{
232+
Name: "Don't check for update when env DCTL_NO_VERSION_CHECK set",
233+
IsRelease: true,
234+
UsageReport: true,
219235
env: map[string]string{
220236
"DCTL_NO_VERSION_CHECK": "foo",
221237
},
222238
expected: false,
223239
},
224240
{
225-
Name: "Should not return error when launching sub command",
226-
IsRelease: false,
227-
args: []string{"scan", "--from", "tfstate://terraform.tfstate"},
228-
expected: false,
241+
Name: "Should not return error when launching sub command",
242+
IsRelease: false,
243+
UsageReport: true,
244+
args: []string{"scan", "--from", "tfstate://terraform.tfstate"},
245+
expected: false,
229246
},
230247
{
231-
Name: "Don't check for update for completion cmd",
232-
IsRelease: true,
233-
args: []string{"completion", "bash"},
234-
expected: false,
248+
Name: "Don't check for update for completion cmd",
249+
IsRelease: true,
250+
UsageReport: true,
251+
args: []string{"completion", "bash"},
252+
expected: false,
235253
},
236254
}
237255

@@ -244,7 +262,7 @@ func TestDriftctlCmd_ShouldCheckVersion(t *testing.T) {
244262
os.Setenv(key, val)
245263
}
246264

247-
cmd := NewDriftctlCmd(mocks.MockBuild{Release: c.IsRelease})
265+
cmd := NewDriftctlCmd(mocks.MockBuild{Release: c.IsRelease, UsageReporting: c.UsageReport})
248266
os.Args = append([]string{"driftctl"}, c.args...)
249267
result := cmd.ShouldCheckVersion()
250268

pkg/cmd/scan.go

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import (
99
"syscall"
1010
"time"
1111

12+
"github.com/cloudskiff/driftctl/build"
1213
"github.com/cloudskiff/driftctl/pkg/analyser"
1314
"github.com/cloudskiff/driftctl/pkg/memstore"
1415
"github.com/cloudskiff/driftctl/pkg/remote/common"
@@ -309,7 +310,8 @@ func scanRun(opts *pkg.ScanOptions) error {
309310
globaloutput.Printf(color.WhiteString("Provider version used to scan: %s. Use --tf-provider-version to use another version.\n"), resourceSchemaRepository.ProviderVersion.String())
310311

311312
if !opts.DisableTelemetry {
312-
telemetry.SendTelemetry(store.Bucket(memstore.TelemetryBucket))
313+
tl := telemetry.NewTelemetry(&build.Build{})
314+
tl.SendTelemetry(store.Bucket(memstore.TelemetryBucket))
313315
}
314316

315317
if !analysis.IsSync() {

pkg/telemetry/telemetry.go

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import (
66
"net/http"
77
"runtime"
88

9+
"github.com/cloudskiff/driftctl/build"
910
"github.com/cloudskiff/driftctl/pkg/memstore"
1011
"github.com/cloudskiff/driftctl/pkg/version"
1112
"github.com/sirupsen/logrus"
@@ -21,7 +22,21 @@ type telemetry struct {
2122
ProviderName string `json:"provider_name"`
2223
}
2324

24-
func SendTelemetry(store memstore.Bucket) {
25+
type Telemetry struct {
26+
build build.BuildInterface
27+
}
28+
29+
func NewTelemetry(build build.BuildInterface) *Telemetry {
30+
return &Telemetry{build: build}
31+
}
32+
33+
func (te Telemetry) SendTelemetry(store memstore.Bucket) {
34+
35+
if !te.build.IsUsageReportingEnabled() {
36+
logrus.Debug("Usage reporting is disabled on this build, telemetry skipped")
37+
return
38+
}
39+
2540
t := &telemetry{
2641
Version: version.Current(),
2742
Os: runtime.GOOS,

pkg/telemetry/telemetry_test.go

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import (
1111
"github.com/cloudskiff/driftctl/pkg/memstore"
1212
"github.com/cloudskiff/driftctl/pkg/resource"
1313
"github.com/cloudskiff/driftctl/pkg/version"
14+
"github.com/cloudskiff/driftctl/test/mocks"
1415
"github.com/jarcoal/httpmock"
1516
"github.com/stretchr/testify/assert"
1617
)
@@ -126,7 +127,24 @@ func TestSendTelemetry(t *testing.T) {
126127
},
127128
)
128129
}
129-
SendTelemetry(store)
130+
tl := NewTelemetry(mocks.MockBuild{UsageReporting: true})
131+
tl.SendTelemetry(store)
130132
})
131133
}
132134
}
135+
136+
func TestTelemetryNotSend(t *testing.T) {
137+
httpmock.Activate()
138+
defer httpmock.DeactivateAndReset()
139+
store := memstore.New().Bucket(memstore.TelemetryBucket)
140+
141+
httpmock.RegisterResponder(
142+
"POST",
143+
"https://2lvzgmrf2e.execute-api.eu-west-3.amazonaws.com/telemetry",
144+
httpmock.NewErrorResponder(nil),
145+
)
146+
tl := NewTelemetry(mocks.MockBuild{UsageReporting: false})
147+
tl.SendTelemetry(store)
148+
149+
assert.Zero(t, httpmock.GetTotalCallCount())
150+
}

test/build.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,3 +5,7 @@ type Build struct{}
55
func (b Build) IsRelease() bool {
66
return false
77
}
8+
9+
func (b Build) IsUsageReportingEnabled() bool {
10+
return false
11+
}

test/mocks/MockBuild.go

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,14 @@
11
package mocks
22

33
type MockBuild struct {
4-
Release bool
4+
Release bool
5+
UsageReporting bool
56
}
67

78
func (m MockBuild) IsRelease() bool {
89
return m.Release
910
}
11+
12+
func (m MockBuild) IsUsageReportingEnabled() bool {
13+
return m.UsageReporting
14+
}

0 commit comments

Comments
 (0)