Skip to content

Commit

Permalink
Internal API - Visibility System support (#1314)
Browse files Browse the repository at this point in the history
  • Loading branch information
eyalbe4 authored Dec 21, 2024
1 parent 8e11807 commit 75cba4a
Show file tree
Hide file tree
Showing 9 changed files with 229 additions and 57 deletions.
10 changes: 5 additions & 5 deletions artifactory/commands/transferfiles/transfer.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,15 +5,16 @@ import (
"encoding/json"
"errors"
"fmt"
"github.com/jfrog/gofrog/safeconvert"
"github.com/jfrog/jfrog-client-go/artifactory/services"
"os"
"os/signal"
"path/filepath"
"strconv"
"strings"
"syscall"

"github.com/jfrog/gofrog/safeconvert"
"github.com/jfrog/jfrog-client-go/artifactory/services"

"github.com/jfrog/gofrog/version"
"github.com/jfrog/jfrog-cli-core/v2/artifactory/commands/transferfiles/state"
"github.com/jfrog/jfrog-cli-core/v2/artifactory/commands/utils/precheckrunner"
Expand Down Expand Up @@ -266,7 +267,7 @@ func (tdc *TransferFilesCommand) initStateManager(allSourceLocalRepos, sourceBui
}

func (tdc *TransferFilesCommand) reportTransferFilesUsage() {
log.Debug(usageReporter.ReportUsagePrefix, "Sending Transfer Files info...")
log.Debug(usageReporter.ArtifactoryCallHomePrefix, "Sending Transfer Files info...")
sourceStorageInfo, err := tdc.sourceStorageInfoManager.GetStorageInfo()
if err != nil {
log.Debug(err.Error())
Expand All @@ -288,8 +289,7 @@ func (tdc *TransferFilesCommand) reportTransferFilesUsage() {
AttributeValue: sourceStorageInfo.BinariesSize,
},
}
err = usage.SendReportUsage(coreutils.GetCliUserAgent(), tdc.CommandName(), tdc.targetStorageInfoManager.GetServiceManager(), reportUsageAttributes...)
if err != nil {
if err = usage.NewArtifactoryCallHome().SendUsage(coreutils.GetCliUserAgent(), tdc.CommandName(), tdc.targetStorageInfoManager.GetServiceManager(), reportUsageAttributes...); err != nil {
log.Debug(err.Error())
}
}
Expand Down
26 changes: 24 additions & 2 deletions artifactory/utils/utils.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,6 @@ import (
"context"
"encoding/json"
"errors"
ioutils "github.com/jfrog/gofrog/io"
"github.com/jfrog/jfrog-client-go/evidence"
"io"
"net/http"
"net/url"
Expand All @@ -16,6 +14,9 @@ import (
"strings"
"time"

ioutils "github.com/jfrog/gofrog/io"
"github.com/jfrog/jfrog-client-go/evidence"

"github.com/jfrog/jfrog-cli-core/v2/utils/config"
"github.com/jfrog/jfrog-cli-core/v2/utils/coreutils"
"github.com/jfrog/jfrog-client-go/access"
Expand All @@ -24,6 +25,7 @@ import (
clientConfig "github.com/jfrog/jfrog-client-go/config"
"github.com/jfrog/jfrog-client-go/distribution"
"github.com/jfrog/jfrog-client-go/http/httpclient"
"github.com/jfrog/jfrog-client-go/jfconnect"
"github.com/jfrog/jfrog-client-go/lifecycle"
"github.com/jfrog/jfrog-client-go/metadata"
clientUtils "github.com/jfrog/jfrog-client-go/utils"
Expand Down Expand Up @@ -260,6 +262,26 @@ func CreateMetadataServiceManager(serviceDetails *config.ServerDetails, isDryRun
return metadata.NewManager(serviceConfig)
}

func CreateJfConnectServiceManager(serverDetails *config.ServerDetails) (jfconnect.Manager, error) {
certsPath, err := coreutils.GetJfrogCertsDir()
if err != nil {
return nil, err
}
jfConnectAuth, err := serverDetails.CreateJfConnectAuthConfig()
if err != nil {
return nil, err
}
serviceConfig, err := clientConfig.NewConfigBuilder().
SetServiceDetails(jfConnectAuth).
SetCertificatesPath(certsPath).
SetInsecureTls(serverDetails.InsecureTls).
Build()
if err != nil {
return nil, err
}
return jfconnect.NewManager(serviceConfig)
}

// This error indicates that the build was scanned by Xray, but Xray found issues with the build.
// If Xray failed to scan the build, for example due to a networking issue, a regular error should be returned.
var errBuildScan = errors.New("issues found during xray build scan")
Expand Down
75 changes: 54 additions & 21 deletions common/commands/command.go
Original file line number Diff line number Diff line change
@@ -1,9 +1,12 @@
package commands

import (
"sync"

"github.com/jfrog/jfrog-cli-core/v2/artifactory/utils"
"github.com/jfrog/jfrog-cli-core/v2/utils/config"
"github.com/jfrog/jfrog-cli-core/v2/utils/coreutils"
coreusage "github.com/jfrog/jfrog-cli-core/v2/utils/usage"
usageReporter "github.com/jfrog/jfrog-cli-core/v2/utils/usage"
"github.com/jfrog/jfrog-client-go/artifactory/usage"
"github.com/jfrog/jfrog-client-go/utils/log"
Expand All @@ -30,29 +33,59 @@ func Exec(command Command) error {
}

func reportUsage(command Command, channel chan<- bool) {
// When the usage reporting is done, signal to the channel.
defer signalReportUsageFinished(channel)
reportUsage := usageReporter.ShouldReportUsage()
if reportUsage {
serverDetails, err := command.ServerDetails()
if err != nil {
log.Debug(usageReporter.ReportUsagePrefix, err.Error())
return
}
if serverDetails != nil && serverDetails.ArtifactoryUrl != "" {
log.Debug(usageReporter.ReportUsagePrefix, "Sending info...")
serviceManager, err := utils.CreateServiceManager(serverDetails, -1, 0, false)
if err != nil {
log.Debug(usageReporter.ReportUsagePrefix, err.Error())
return
}
err = usage.SendReportUsage(coreutils.GetCliUserAgent(), command.CommandName(), serviceManager)
if err != nil {
log.Debug(err.Error())
return
}

if !usageReporter.ShouldReportUsage() {
log.Debug("Usage reporting is disabled")
return
}

serverDetails, err := command.ServerDetails()
if err != nil {
log.Debug("Usage reporting:", err.Error())
return
}

if serverDetails != nil {
var wg sync.WaitGroup

// Report the usage to Artifactory's Call Home API.
if serverDetails.ArtifactoryUrl != "" {
wg.Add(1)
go func() {
defer wg.Done()
reportUsageToArtifactoryCallHome(command, serverDetails)
}()
}
} else {
log.Debug("Usage info is disabled.")

// Report the usage to the Visibility System.
wg.Add(1)
go func() {
defer wg.Done()
reportUsageToVisibilitySystem(command, serverDetails)
}()

// Wait for the two report actions to finish.
wg.Wait()
}
}

func reportUsageToVisibilitySystem(command Command, serverDetails *config.ServerDetails) {
if err := coreusage.NewVisibilitySystemManager(serverDetails).SendUsage(command.CommandName()); err != nil {
log.Debug("Visibility System Usage reporting:", err.Error())
}
}

func reportUsageToArtifactoryCallHome(command Command, serverDetails *config.ServerDetails) {
log.Debug(usageReporter.ArtifactoryCallHomePrefix, "Sending info...")
serviceManager, err := utils.CreateServiceManager(serverDetails, -1, 0, false)
if err != nil {
log.Debug(usageReporter.ArtifactoryCallHomePrefix, err.Error())
return
}
if err = usage.NewArtifactoryCallHome().SendUsage(coreutils.GetCliUserAgent(), command.CommandName(), serviceManager); err != nil {
log.Debug(err.Error())
}
}

Expand Down
6 changes: 3 additions & 3 deletions go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -12,9 +12,9 @@ require (
github.com/google/uuid v1.6.0
github.com/gookit/color v1.5.4
github.com/jedib0t/go-pretty/v6 v6.6.3
github.com/jfrog/build-info-go v1.10.6
github.com/jfrog/build-info-go v1.10.7
github.com/jfrog/gofrog v1.7.6
github.com/jfrog/jfrog-client-go v1.48.3
github.com/jfrog/jfrog-client-go v1.48.4
github.com/magiconair/properties v1.8.7
github.com/manifoldco/promptui v0.9.0
github.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c
Expand Down Expand Up @@ -96,7 +96,7 @@ require (
gopkg.in/warnings.v0 v0.1.2 // indirect
)

// replace github.com/jfrog/jfrog-client-go => github.com/eyalbe4/jfrog-client-go v1.28.1-0.20241103083749-45c13ff7fe16
// replace github.com/jfrog/jfrog-client-go => github.com/eyalbe4/jfrog-client-go v1.28.1-0.20241220200217-c4b9ef90c453

// replace github.com/jfrog/build-info-go => github.com/jfrog/build-info-go v1.8.9-0.20241121100855-e7a75ceee2bd

Expand Down
18 changes: 4 additions & 14 deletions go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -89,12 +89,12 @@ github.com/jedib0t/go-pretty/v6 v6.6.3 h1:nGqgS0tgIO1Hto47HSaaK4ac/I/Bu7usmdD3qv
github.com/jedib0t/go-pretty/v6 v6.6.3/go.mod h1:zbn98qrYlh95FIhwwsbIip0LYpwSG8SUOScs+v9/t0E=
github.com/jfrog/archiver/v3 v3.6.1 h1:LOxnkw9pOn45DzCbZNFV6K0+6dCsQ0L8mR3ZcujO5eI=
github.com/jfrog/archiver/v3 v3.6.1/go.mod h1:VgR+3WZS4N+i9FaDwLZbq+jeU4B4zctXL+gL4EMzfLw=
github.com/jfrog/build-info-go v1.10.6 h1:zH1ZhXlVfi5DlFyunygHjrdOcnv5qxfeLqmsfD4+lc4=
github.com/jfrog/build-info-go v1.10.6/go.mod h1:JcISnovFXKx3wWf3p1fcMmlPdt6adxScXvoJN4WXqIE=
github.com/jfrog/build-info-go v1.10.7 h1:10NVHYg0193gJpQft+S4WQfvYMtj5jlwwhJRvkFJtBE=
github.com/jfrog/build-info-go v1.10.7/go.mod h1:JcISnovFXKx3wWf3p1fcMmlPdt6adxScXvoJN4WXqIE=
github.com/jfrog/gofrog v1.7.6 h1:QmfAiRzVyaI7JYGsB7cxfAJePAZTzFz0gRWZSE27c6s=
github.com/jfrog/gofrog v1.7.6/go.mod h1:ntr1txqNOZtHplmaNd7rS4f8jpA5Apx8em70oYEe7+4=
github.com/jfrog/jfrog-client-go v1.48.3 h1:HJpKGul0f/S2i7Uf7K/GwS1EUGiirt1LWXL1lanKNhU=
github.com/jfrog/jfrog-client-go v1.48.3/go.mod h1:1a7bmQHkRmPEza9wva2+WVrYzrGbosrMymq57kyG5gU=
github.com/jfrog/jfrog-client-go v1.48.4 h1:uXvBr2ebFKpBRUhWgC9TSSJe32IbSYGlbDp9tDzBcaY=
github.com/jfrog/jfrog-client-go v1.48.4/go.mod h1:2ySOMva54L3EYYIlCBYBTcTgqfrrQ19gtpA/MWfA/ec=
github.com/kevinburke/ssh_config v1.2.0 h1:x584FjTGwHzMwvHx18PXxbBVzfnxogHaAReU4gf13a4=
github.com/kevinburke/ssh_config v1.2.0/go.mod h1:CT57kijsi8u/K/BOFA39wgDQJ9CxiF4nAY/ojJ6r6mM=
github.com/klauspost/compress v1.4.1/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A=
Expand Down Expand Up @@ -222,8 +222,6 @@ go.uber.org/atomic v1.9.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc=
go.uber.org/multierr v1.9.0 h1:7fIwc/ZtS0q++VgcfqFDxSBZVv/Xo49/SYnDFupUwlI=
go.uber.org/multierr v1.9.0/go.mod h1:X2jQV1h+kxSjClGpnseKVIxpmcjrj7MNnI0bnlfKTVQ=
golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
golang.org/x/crypto v0.29.0 h1:L5SG1JTTXupVV3n6sUqMTeWbjAyfPwoda2DLX8J8FrQ=
golang.org/x/crypto v0.29.0/go.mod h1:+F4F4N5hv6v38hfeYwTdx20oUvLLc+QfrE9Ax9HtgRg=
golang.org/x/crypto v0.31.0 h1:ihbySMvVjLAeSH1IbfcRTkD/iNscyz8rGzjF/E5hV6U=
golang.org/x/crypto v0.31.0/go.mod h1:kDsLvtWBEx7MV9tJOj9bnXsPbxwJQ6csT/x4KIN4Ssk=
golang.org/x/exp v0.0.0-20241108190413-2d47ceb2692f h1:XdNn9LlyWAhLVp6P/i8QYBW+hlyhrhei9uErw2B5GJo=
Expand All @@ -234,8 +232,6 @@ golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qx
golang.org/x/net v0.31.0 h1:68CPQngjLL0r2AlUKiSxtQFKvzRVbnzLwMUn5SzcLHo=
golang.org/x/net v0.31.0/go.mod h1:P4fl1q7dY2hnZFxEk4pPSkDHF+QqjitcnDjUQyMM+pM=
golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.9.0 h1:fEo0HyrW1GIgZdpbhCRO0PkJajUS5H9IFUztCgEo2jQ=
golang.org/x/sync v0.9.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
golang.org/x/sync v0.10.0 h1:3NQrjDixjgGwUOCaF8w2+VYHv0Ve/vGYSbdkTa98gmQ=
golang.org/x/sync v0.10.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
golang.org/x/sys v0.0.0-20181122145206-62eef0e2fa9b/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
Expand All @@ -256,18 +252,12 @@ golang.org/x/sys v0.0.0-20220704084225-05e143d24a9e/go.mod h1:oPkhp1MJrh7nUepCBc
golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.27.0 h1:wBqf8DvsY9Y/2P8gAfPDEYNuS30J4lPHJxXSb/nJZ+s=
golang.org/x/sys v0.27.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
golang.org/x/sys v0.28.0 h1:Fksou7UEQUWlKvIdsqzJmUmCX3cZuD2+P3XyyzwMhlA=
golang.org/x/sys v0.28.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
golang.org/x/term v0.26.0 h1:WEQa6V3Gja/BhNxg540hBip/kkaYtRg3cxg4oXSw4AU=
golang.org/x/term v0.26.0/go.mod h1:Si5m1o57C5nBNQo5z1iq+XDijt21BDBDp2bK0QI8e3E=
golang.org/x/term v0.27.0 h1:WP60Sv1nlK1T6SupCHbXzSaN0b9wUmsPoRS9b61A23Q=
golang.org/x/term v0.27.0/go.mod h1:iMsnZpn0cago0GOrHO2+Y7u7JPn5AylBrcoWkElMTSM=
golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
golang.org/x/text v0.20.0 h1:gK/Kv2otX8gz+wn7Rmb3vT96ZwuoxnQlY+HlJVj7Qug=
golang.org/x/text v0.20.0/go.mod h1:D4IsuqiFMhST5bX19pQ9ikHC2GsaKyk/oF+pn3ducp4=
golang.org/x/text v0.21.0 h1:zyQAAkrwaneQ066sspRyJaG9VNi/YJ1NfzcGB3hZ/qo=
golang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ=
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
Expand Down
17 changes: 12 additions & 5 deletions utils/config/config.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,12 @@ import (
"bytes"
"encoding/json"
"errors"
"os"
"path/filepath"
"strconv"
"strings"
"time"

"github.com/buger/jsonparser"
biutils "github.com/jfrog/build-info-go/utils"
"github.com/jfrog/jfrog-cli-core/v2/utils/coreutils"
Expand All @@ -22,11 +28,6 @@ import (
"github.com/jfrog/jfrog-client-go/utils/log"
xrayAuth "github.com/jfrog/jfrog-client-go/xray/auth"
xscAuth "github.com/jfrog/jfrog-client-go/xsc/auth"
"os"
"path/filepath"
"strconv"
"strings"
"time"
)

func init() {
Expand Down Expand Up @@ -747,6 +748,12 @@ func (serverDetails *ServerDetails) CreateAccessAuthConfig() (auth.ServiceDetail
return serverDetails.createAuthConfig(pAuth)
}

func (serverDetails *ServerDetails) CreateJfConnectAuthConfig() (auth.ServiceDetails, error) {
pAuth := accessAuth.NewAccessDetails()
pAuth.SetUrl(utils.AddTrailingSlashIfNeeded(serverDetails.Url) + "jfconnect/")
return serverDetails.createAuthConfig(pAuth)
}

func (serverDetails *ServerDetails) CreateLifecycleAuthConfig() (auth.ServiceDetails, error) {
lcAuth := lifecycleAuth.NewLifecycleDetails()
lcAuth.SetUrl(serverDetails.LifecycleUrl)
Expand Down
14 changes: 7 additions & 7 deletions utils/usage/usage.go
Original file line number Diff line number Diff line change
Expand Up @@ -18,8 +18,8 @@ import (
)

const (
ReportUsagePrefix = "Usage Report:"
clientIdAttributeName = "clientId"
ArtifactoryCallHomePrefix = "Artifactory Call Home:"
clientIdAttributeName = "clientId"
)

type UsageReporter struct {
Expand Down Expand Up @@ -57,7 +57,7 @@ func NewUsageReporter(productId string, serverDetails *config.ServerDetails) *Us
func ShouldReportUsage() (reportUsage bool) {
reportUsage, err := clientutils.GetBoolEnvValue(coreutils.ReportUsage, true)
if err != nil {
log.Debug(ReportUsagePrefix + err.Error())
log.Debug(ArtifactoryCallHomePrefix + err.Error())
return false
}
return reportUsage
Expand Down Expand Up @@ -85,10 +85,10 @@ func (ur *UsageReporter) Report(features ...ReportFeature) {
return
}
if len(features) == 0 {
log.Debug(ReportUsagePrefix, "Nothing to send.")
log.Debug(ArtifactoryCallHomePrefix, "Nothing to send.")
return
}
log.Debug(ReportUsagePrefix, "Sending info...")
log.Debug(ArtifactoryCallHomePrefix, "Sending info...")
if ur.sendToEcosystem {
ur.reportWaitGroup.Go(func() (err error) {
if err = ur.reportToEcosystem(features...); err != nil {
Expand Down Expand Up @@ -117,7 +117,7 @@ func (ur *UsageReporter) Report(features ...ReportFeature) {

func (ur *UsageReporter) WaitForResponses() (err error) {
if err = ur.reportWaitGroup.Wait(); err != nil {
err = fmt.Errorf("%s %s", ReportUsagePrefix, err.Error())
err = fmt.Errorf("%s %s", ArtifactoryCallHomePrefix, err.Error())
}
return
}
Expand Down Expand Up @@ -169,7 +169,7 @@ func (ur *UsageReporter) reportToArtifactory(features ...ReportFeature) (err err
if err != nil {
return
}
return usage.ReportUsageToArtifactory(ur.ProductId, serviceManager, converted...)
return usage.NewArtifactoryCallHome().SendUsageToArtifactory(ur.ProductId, serviceManager, converted...)
}

func convertAttributesToMap(reportFeature ReportFeature) (converted map[string]string) {
Expand Down
Loading

0 comments on commit 75cba4a

Please sign in to comment.