Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Internal API - Visibility System support #1314

Merged
merged 10 commits into from
Dec 21, 2024
Merged
Show file tree
Hide file tree
Changes from 4 commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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 donw, signal to the channel.
eyalbe4 marked this conversation as resolved.
Show resolved Hide resolved
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

// Repotr the usage to Artifactory's Call Home API.
eyalbe4 marked this conversation as resolved.
Show resolved Hide resolved
if serverDetails.ArtifactoryUrl != "" {
wg.Add(1)
go func() {
defer wg.Done()
reportUsageToArtifactoryCallHome(command, serverDetails)
}()
}
} else {
log.Debug("Usage info is disabled.")

// Repotr the usage to the Visibility System.
eyalbe4 marked this conversation as resolved.
Show resolved Hide resolved
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
2 changes: 1 addition & 1 deletion go.mod
Original file line number Diff line number Diff line change
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
14 changes: 2 additions & 12 deletions go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,8 @@ github.com/elazarl/goproxy v0.0.0-20230808193330-2592e75ae04a h1:mATvB/9r/3gvcej
github.com/elazarl/goproxy v0.0.0-20230808193330-2592e75ae04a/go.mod h1:Ro8st/ElPeALwNFlcTpWmkr6IoMFfkjXAvTHpevnDsM=
github.com/emirpasic/gods v1.18.1 h1:FXtiHYKDGKCW2KzwZKx0iC0PQmdlorYgdFG9jPXJ1Bc=
github.com/emirpasic/gods v1.18.1/go.mod h1:8tpGGwCnJ5H4r6BWwaV6OrWmMoPhUl5jm/FMNAnJvWQ=
github.com/eyalbe4/jfrog-client-go v1.28.1-0.20241220200217-c4b9ef90c453 h1:yA0LCoCKjZlSUDsh9W7Dsgg6lcvRpRAe9pq1wJojgIA=
github.com/eyalbe4/jfrog-client-go v1.28.1-0.20241220200217-c4b9ef90c453/go.mod h1:3rdSCzKoN1l3wklL33D7nu+nB3089rIgxwyoprFdCaw=
github.com/forPelevin/gomoji v1.2.0 h1:9k4WVSSkE1ARO/BWywxgEUBvR/jMnao6EZzrql5nxJ8=
github.com/forPelevin/gomoji v1.2.0/go.mod h1:8+Z3KNGkdslmeGZBC3tCrwMrcPy5GRzAD+gL9NAwMXg=
github.com/frankban/quicktest v1.14.6 h1:7Xjx+VpznH+oBnejlPUj8oUpdxnVs4f8XU8WnHkI4W8=
Expand Down Expand Up @@ -93,8 +95,6 @@ github.com/jfrog/build-info-go v1.10.6 h1:zH1ZhXlVfi5DlFyunygHjrdOcnv5qxfeLqmsfD
github.com/jfrog/build-info-go v1.10.6/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/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/")
Copy link
Contributor

@sverdlov93 sverdlov93 Dec 22, 2024

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

woudln't this cause double jfconnect/ on the URL?
because here you create the base URL ecosys.jfrog.io/access/jfconnect and on the PostMetric you add jfconnect/api/v1/backoffice/metrics/log

so wouldn't it become: ecosys.jfrog.io/access/jfconnect/jfconnect/api/v1/backoffice/metrics/log

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think you're right @sverdlov93. Good catch 👍

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
Loading