jfrog / jfrog-client-go Goto Github PK
View Code? Open in Web Editor NEWAll go clients for JFrog products
License: Apache License 2.0
All go clients for JFrog products
License: Apache License 2.0
When #299 was implemented, it seems that the second variable returned is no long the number of expected files, it's now returning the number of failures. While that is completely reasonable, the interface and the function manager.DownloadFiles both expect something else.
DownloadFiles(params ...services.DownloadParams) (totalDownloaded, totalExpected int, err error)
Expected behavior
Either the interface needs to change to totalFailed or ArtifactoryServicesManagerImp.DownloadFiles needs to change to return totalDownloaded+totalFailed.
Versions
Is your feature request related to a problem? Please describe.
File specs support filtering the searched artifacts by a build, by provising the build name and build number.
Following the introduction of projects in Artifactory, file specs should also support providing the project of the filteredbuild.
Describe the solution you'd like to see
Add a new optional "project" property to the file spec schema.
Describe alternatives you've considered
N/A
Additional context
N/A
In many corporate environments, client certificates are used in addition to classic user credentials (dont blame the messenger).
It would thus be nice to have support in the jfrog clients for client certificates.
Using the examples documented on the README.md to upload a files you can upload files but if there's an error it's not returned just logged.
Environment
go version go1.14.2 windows/amd64
Lib version 0.9.1
Personal Artifactory server
How to reproduce the error:
package main
import (
"os"
"fmt"
"github.com/jfrog/jfrog-client-go/artifactory/auth"
"github.com/jfrog/jfrog-client-go/config"
"github.com/jfrog/jfrog-client-go/artifactory"
"github.com/jfrog/jfrog-client-go/artifactory/services"
"github.com/jfrog/jfrog-client-go/utils/log"
)
func main() {
log.SetLogger(log.NewLogger(log.INFO, os.Stdout))
rtDetails := auth.NewArtifactoryDetails()
rtDetails.SetUrl("http://localhost:8081/artifactory")
rtDetails.SetUser("wronguser")
rtDetails.SetPassword("password")
serviceConfig, err := config.NewConfigBuilder().
SetArtDetails(rtDetails).Build()
if err != nil {
fmt.Printf("%v", err)
return
}
rtManager, err := artifactory.New(&rtDetails, serviceConfig)
params := services.NewUploadParams()
params.Pattern = "/tmp/path"
params.Target = "test/test/"
params.Recursive = true
params.IncludeDirs = false
params.Regexp = false
params.Flat = true
info, _, _, err := rtManager.UploadFiles(params)
if err != nil {
fmt.Printf("Should print this error %v", err)
return
}
fmt.Printf("%v", info)
}
Expected behavior:
$ go run main.go
[Info] [Thread 0] Uploading artifact: /tmp/test/test2
[Info] [Thread 2] Uploading artifact: /tmp/test/test.7z
[Error] [Thread 2] Artifactory response: 401 Unauthorized
[Error] [Thread 0] Artifactory response: 401 Unauthorized
[Error] Failed uploading 2 artifacts.
Should print this error Artifactory response: 401 Unauthorized
Actual behavior:
$ go run main.go
[Info] [Thread 0] Uploading artifact: /tmp/test/test2
[Info] [Thread 2] Uploading artifact: /tmp/test/test.7z
[Error] [Thread 2] Artifactory response: 401 Unauthorized
[Error] [Thread 0] Artifactory response: 401 Unauthorized
[Error] Failed uploading 2 artifacts.
[]
The order will not match for the threads, but in order to do error handling the error should be returned if there's one.
Hi Team,
So far we want to develop go CLI based your SDK for managing Multi-push Replication. but the current version is lacking that feature. I appreciate it if you can add that feature In the future.
here is the document you can reference. https://www.jfrog.com/confluence/display/JFROG/Artifactory+REST+API#ArtifactoryRESTAPI-CreateorReplaceLocalMulti-pushReplication
Regards
When I execute go test ./tests
on master branch it is failing with the following errors
$ go test ./tests/
[Debug] Sending HTTP GET request to: http://localhost:8081/artifactory/api/repositories/jfrog-client-tests-repo1
[Error] Get http://localhost:8081/artifactory/api/repositories/jfrog-client-tests-repo1: EOF
FAIL github.com/jfrog/jfrog-client-go/tests 0.023s
FAIL
Looking at the Tests
section in README, it appears that an Artifactory Pro instance must be running.
This dependency can't be satisfied all the time. Can this dependency be avoided in tests?
Can the spelling mistakes throughout the library and documentation be fixed?
Is your feature request related to a problem? Please describe.
When using file specs to upload as archive, multiple groups can have the same target. Each of these groups might have a different value for the explode option. The value of the first of these groups to appear in the spec determines if the archive will be exploded or not. The current behavior is not what we'd expect the CLI to do.
Describe the solution you'd like to see
The groups with the archive flag set to true will be uploaded separately and be exploded, while the other groups will be uploaded in the same archive.
Describe alternatives you've considered
If the explode flag is true in at least one of the groups, the archive will be exploded. If, in addition, the flag is set explicitly to false in another group with the same target, then an error will be returned.
Another option is to return an error if the value of explode is not the same in all of the groups with the same target.
Hello,
Unless I'm mistaken, your client has no context.Context management.
Also, would you be able to expose a method to define the context.Context and thus manage the propagation of cancel, timeout, ...?
Thank you in advance.
Regards.
We use Artifactory throughout our organization, installing the cli on many servers running RHEL. Installing, deleting and updating the cli would be much simpler and less error-prone if done with a package manager.
Just as Artifactory server is available as an RPM distribution, the client should be as well.
Is your feature request related to a problem? Please describe.
I'm using jfrog-client-go
to build a tool that allows us to sync artifacts to artifactory servers behind a bastion host. One of the things we need is the ability to set Transport: &http.Transport{Proxy: http.ProxyURL(proxyUrl)}
in the http.Client
. It would also be nice if we could completely configure the http.Client
so we could use a tool like https://github.com/seborama/govcr for recording & playback of HTTP requests/responses during testing.
Describe the solution you'd like to see
a SetHttpClient(client *http.Client)
method on JfrogHttpClient and HttpClient classes.
Describe alternatives you've considered
Setting the http_proxy
environmental variable is not sufficient for us, we need to be able to configure the HTTP Proxy used by the Artifactory client on demand.
I am getting panic with message "Logger not initialized. See API documentation." when calling SearchFiles
method
artifactoryDetails := auth.NewArtifactoryDetails()
artifactoryDetails.SetUrl("myprivaterepo.com/artifactory")
serviceConfig, err := config.NewConfigBuilder().
SetServiceDetails(artifactoryDetails).
Build()
artifactoryManager, err := artifactory.New(&artifactoryDetails, serviceConfig)
params := services.NewSearchParams()
params.Pattern = "my_artifact"
params.Recursive = true
reader, err := artifactoryMgr.SearchFiles(params) // panic after this line
I don't need logging here and couldn't find anything mentioning logging on the docs.
what am I doing wrong?
The DownloadFiles documentation is very limited. There is no mention of what the params.Target does:
https://pkg.go.dev/github.com/jfrog/[email protected]/artifactory/services/utils#ArtifactoryCommonParams
In my testing, I haven't been able to set target as a dir to be able to download the files there.
How would you go about that?
I have a working jfrog-cli setup on my machine, which i want to reproduce in Go code.
$ jfrog rt ping
Ok
Trying to re-use this working setup in a Go program instead of the commandline, i waded through jfrog-cli-go, jfrog-go, and jfrog-client-go without any success. Documentation suggests to use the artifactory service manager from jfrog-client-go, but the only place i found that knows how to instantiate configs from $HOME/.jfrog/jfrog-cli.conf is in jfrog-cli-go, unfortunately the config in client and cli are not interchangeable.
Trying to manually copy struct members Url
, User
and Password
from cli to client struct results in a sigsev.
panic: runtime error: invalid memory address or nil pointer dereference
[signal SIGSEGV: segmentation violation code=0x1 addr=0x60 pc=0x9501a2]
goroutine 1 [running]:
github.com/jfrog/jfrog-client-go/artifactory/services.(*PingService).Ping(0xc00012be78, 0x0, 0x0, 0x0, 0xc00012e4b0, 0x0)
go/pkg/mod/github.com/jfrog/[email protected]/artifactory/services/ping.go:39 +0x42
github.com/jfrog/jfrog-client-go/artifactory.(*ArtifactoryServicesManager).Ping(0xc00012e4b0, 0xb9f740, 0xc0000c6640, 0x0, 0x0, 0xc00012e4b0)
go/pkg/mod/github.com/jfrog/[email protected]/artifactory/manager.go:166 +0x79
main.main()
work/jfrog-lib/main.go:49 +0x36f
What i am missing is a clear, minimal, concise, working example of a main.go that can Ping() the artifactory server. My trial and error path currently looks like this:
package main
// github.com/jfrog/jfrog-cli-go/
// "github.com/jfrog/jfrog-cli-go/jfrog-cli/commands/generic"
// "github.com/jfrog/jfrog-cli-go/jfrog-cli/artifactory/generic"
import (
"fmt"
"github.com/jfrog/jfrog-cli-go/jfrog-cli/utils/config"
"github.com/jfrog/jfrog-client-go/artifactory"
"github.com/jfrog/jfrog-client-go/artifactory/auth"
)
func main() {
cs, err := config.GetAllArtifactoryConfigs()
if err != nil {
fmt.Errorf("error reading configuration: %v\n", err)
}
var configDetails *config.ArtifactoryDetails
for _, c := range cs {
if c.IsDefault {
fmt.Printf("default entry: %+v\n", c)
configDetails = c
}
}
if !configDetails.IsDefault {
fmt.Errorf("configuration does not contain default entry")
}
authDetails := auth.NewArtifactoryDetails()
authDetails.SetUrl(configDetails.Url)
authDetails.SetUser(configDetails.User)
authDetails.SetPassword(configDetails.Password)
// Ping
// rtManager, err := artifactory.New(dc)
// client := httpclient.New()
// ps := services.NewPingService(&client)
// ps.Ping()
config, _ := artifactory.NewConfigBuilder().SetInsecureTls(true).Build()
asm, err := artifactory.New(&authDetails, config)
if err != nil {
fmt.Errorf("error creating artifactory services manager: %v\n",
err)
}
asm.Ping()
/*
rtManager, err := artifactory.New(rtDetails, serviceConfig)
params := services.NewSearchParams()
// params.Pattern = "repo/"
params.Recursive = true
searchResult := rtManager.SearchFiles(params)
*/
/* Using the jfrog-cli-go package does not find generic search command
s := generic.NewSearchCommand()
fmt.Printf("search: %+v\n", s)
*/
}
Is your feature request related to a problem? Please describe.
When uploading files as archive using a spec, with multiple groups having the same target, the archive in Artifactory will have the props of all of the relevant groups in the spec. It's done by concatenating all of the props to the URL, without omitting identical props (Artifactory does that for us). That might cause the UR be very long, and possibly pass the limit of the URL length.
Describe the solution you'd like to see
Omit identical props.
I'm trying to download a file from an Artifactory repository.
I'm using jfrog-client-go version v0.9.0
const artifactoryUrl = "My Artifactory URL"
rtDetails := auth.NewArtifactoryDetails()
rtDetails.SetUrl(artifactoryUrl)
serviceConfig, err := config.NewConfigBuilder().
SetArtDetails(rtDetails).
SetDryRun(false).
Build()
if err != nil {
panic(err)
}
rtManager, err := artifactory.New(&rtDetails, serviceConfig)
if err != nil {
panic(err)
}
params := services.NewDownloadParams()
params.Target = "/tmp/file.json"
params.Pattern = "path to my file.json"
params.Recursive = true
params.Regexp = false
params.IncludeDirs = false
params.Flat = true
params.Explode = false
params.Symlink = false
params.Retries = 5
_, _, err = rtManager.DownloadFiles(params)
The code rtManager.DownloadFiles(params) leads to do a SendPost() from the code client.go of jfrog-client-go that fails with:
Artifactory response: 405 Method Not Allowed
Note that if I do a "curl -X POST" with the URL of the file that I want to recover from artifactory then I get the same issue 405 while it works like a charm with a "curl -X GET"
Did I miss something in the params structure ?
Should it be SendGet() instead of SendPost() ?
In order to properly initialize UploadParams, it must include a new instance of the substructure included only as a reference within UploadParams.
Without it, you get a SIGSEGV when trying to write to uninitialized memory for eg.
Pattern or ExcludePatterns
However, the code is:
func NewUploadParams() UploadParams {
return UploadParams{}
}
Hello,
I'm trying to use a regex when searching for files in Artifactory, but not getting any results. I've used:
searchParams := services.NewSearchParams()
searchParams.Regex = true
searchParams.Pattern = "greenlake-centos-7-7-([0-9]*).ova"
resultitems, err := rtManager.SearchFiles(searchParams)
To match files such as:
greenlake-centos-7-7-154678.ova
But I don't get any matches. What have I done wrong? Are regexes supported for SearchFiles().
Thanks.
-Eamonn.
Hey folks,
I appreciate the Golang support but please documentation breaking API changes.
...GetConfig().GetArtDetails undefined (type config.Config has no field or method GetArtDetails)
This was broken upgrading from v0.8.1 -> v0.9.0
This commit broke the API and there were no documentation/announcement for it a265a82
This method is a public API so please dont just change it without announcement :(
When using the DownloadVersion
function for a package version with multiple files, the behavior of DownloadVersionParams.TargetPath
is unintuitive. The observed behavior is the following:
TargetPath
is the path to an existing directory that does not end in /
(for example, target/path
), then no downloaded files are savedTargetPath
is a path to a file that does not exist in a directory (for example, target/path/foo
), then only a single file is downloaded, and the file is given the specified name (for example, target/path/com/org/product/version/foo
)TargetPath
is a path to an existing directory that ends in /
(for example, target/path/
), then all version files are downloaded properlyIt appears that (3) is the only behavior that is correct -- the behavior of (1) and (2) is very confusing and hard to reason about.
I think the better behavior would be for (1) and (3) to behave the same (basically, check if the output target is an existing directory and, if it is, download version files into the directory), and (2) should raise some kind of error rather than downloading all files in a way that overwrite each other.
Using the latest and greatest it's telling me that --interactive
is telling me that the flag is provided but not defined?
./jfrog rt ping --interactive=false --user=admin --password=admin --url=http://some-artifactory-instance
Any thoughts?
Hi,
It seems that this package is no longer usable. It it still being maintained?
When I try to compile anything using it, I get
../../github.com/jfrog/jfrog-client-go/httpclient/client.go:252:10: undefined: archiver.MatchingFormat
../../github.com/jfrog/jfrog-client-go/httpclient/client.go:306:12: arch.Read undefined (type archiver.Archiver has no field or method Read)
../../github.com/jfrog/jfrog-client-go/httpclient/client.go:316:20: invalid method expression archiver.Zip.Open (needs pointer receiver: (*archiver.Zip).Open)
../../github.com/jfrog/jfrog-client-go/httpclient/client.go:316:20: archiver.Zip.Open undefined (type archiver.Zip has no method Open)
../../github.com/jfrog/jfrog-client-go/httpclient/client.go:476:10: undefined: archiver.MatchingFormat
This appears to be caused by one of the dependencies (https://github.com/mholt/archiver) having been recently rewritten.
Hey all,
It appears that due to the leaveBodyOpen
style functions, ports aren't getting reused and causing SNAT port exhaustion when being run w/ a large number of requests on AzDO or GHA.
Specifically, I came across this while trying to run a npm install from the jfrog cli, w/ build metadata enabled. Since there is an individual AQL call made for every single dependency to retrieve the checksum for said dependency - it quickly saturates the ports and causes a TCP timeout.
I had looked @ fixing this by writing 'better' AQL in the jfrog CLI, but it appears to cause a segfault on the Artifactory server side due to payload being too large. So instead I started tracking down the network calls, and was led here.
A brief search thru the git history didn't appear to turn up anything -- I'm wondering what the use case for the 'leave body open' connections is? An easy fix would be to not use it - this is certainly a hindrance for any NPM style builds w/ build-info enabled.
The current module dependencies are:
[ ] github.com/buger/jsonparser 0.0.0-20180910192245-6acdf747ae99 -> 1.0.0
[ ] github.com/mholt/archiver 2.1.0+incompatible -> 3.1.1+incompatible
[ ] github.com/pkg/errors 0.8.0 -> 0.9.1
[ ] github.com/spf13/viper 1.2.1 -> 1.7.1
[ ] github.com/stretchr/testify 1.2.2 -> 1.6.1
[ ] github.com/xanzy/ssh-agent 0.2.0 -> 0.2.1
[ ] golang.org/x/crypto 0.0.0-20181001203147-e3636079e1a4 -> 0.0.0-20200728195943-123391ffb6de
[ ] gopkg.in/src-d/go-git.v4 4.7.0 -> 4.13.1
For us, at least the old github.com/mholt/archiver
dependency leads to problems, since most other projects use 3.x.x. The 2.1.0 version is from 2018.
Also gopkg.in/src-d/go-git.v4
is dead. It is encouraged to use the maintained fork: github.com/go-git/go-git/v5
.
It'd be great to support the POST maven_central_sync
endpoint.
POST /maven_central_sync/:subject/:repo/:package/versions/:version
{
"username": "userToken", // Sonatype OSS user token
"password": "passwordToken", // Sonatype OSS user password
"close": "1" // Optional
}
https://bintray.com/docs/api/#_sync_version_artifacts_to_maven_central
insecureTls
is supported in here
type httpClientBuilder struct {
certificatesDirPath string
clientCertPath string
clientCertKeyPath string
insecureTls bool
ctx context.Context
}
ServiceDetails
struct in here defines methods for settings client certificate, artifactory urls etc. but doesn't have a method for setting insecure tls.
Is there a reason for it? or just missed.
Context: I would like to use the ServiceDetails
object to set the insecureTLS flag rather than using a http client builder.
Hello,
Here: https://github.com/jfrog/jfrog-client-go/blob/master/config/configbuilder.go#L9, you set an arbitrary value for threads. This value seems to be set without reflection and to ignore the actual capacities of the machine that will run the client.
Wouldn't it be better to set this default value to: runtime.GOMAXPROCS (0) ?
This will allow to use the maximum thread available for the running machine or the redefined maximum.
Thank you in advance.
Regards.
Hi,
I'd like to be able to configure xRay watches using this library.
This would allow me to consume it from the artifactory terraform provider.
If I were to implement this, should it be created in ./artifactory/services/xraywatches.go
?
Is your feature request related to a problem? Please describe.
In order to get ContentReader's length, it iterates over all of its items.
Describe the solution you'd like to see
A cheaper mechanism to get a ContentReader's length.
The current state of the build info struct contains the deprecated VCS type: https://github.com/jfrog/jfrog-client-go/blob/master/artifactory/buildinfo/buildinfo.go#L99
This should be changed to a list of VCS.
According to the readme I should be able to delete like this:
params := services.NewDeleteParams()
params.Aql = utils.Aql{
ItemsFind: query,
}
params.Recursive = true
pathsToDelete, err := rtManager.GetPathsToDelete(params)
rtManager.DeleteFiles(deleteItems)
But instead I have to convert the type coming from GetPathsToDelete like so:
params := services.NewDeleteParams()
params.Aql = utils.Aql{
ItemsFind: query,
}
params.Recursive = true
pathsToDelete, err := rtManager.GetPathsToDelete(params)
deleteItems := make([]services.DeleteItem, len(pathsToDelete))
for i, item := range pathsToDelete {
deleteItems[i] = item
}
rtManager.DeleteFiles(deleteItems)
Maybe it's because of a free bintray bandwidth?
and almost always completes all the file uploads on a retry.
Artifactory REST API /api/repositories (https://www.jfrog.com/confluence/display/JFROG/Artifactory+REST+API#ArtifactoryRESTAPI-GetRepositories) response includes the repository type information (LOCAL, REMOTE, VIRTUAL) which is not included in the GetAllRepositories return value. Is this just an oversight or an intentional decision?
Looking at the code it should be trivial to fix by adding 'Type' field to RepositoryDetails struct in getrepository.go.
My use case for this would be to first get all the repositories configured in Artifactory and filter the results based on the repository type and/or package type before getting the full details of the selected repositories.
Hi,
Some of the commits in the master branch are of interest to me.
I would like to know when the next release going to be.
Thanks
Currently its not possible to create a token without expiry over the api. The reason is this code:
=> If you specify "0" the expires_in is not send to the server and the default is used.
Please consider semantic versioning.
You tagged a new release 0.2.2 18h ago, but this version is incompatible with 0.2.1. Patch releases should be backwards-compatible bug fixes.
This library is missing the logic for build environment variable include / exclude patterns. It defines the configuration structure where the patterns are stored, but the filter logic is actually in the CLI code and is not exported so it is unusable.
type Configuration struct {
ArtDetails auth.ServiceDetails
BuildUrl string
DryRun bool
EnvInclude string
EnvExclude string
}
type filterFunc func(map[string]string) (map[string]string, error)
func createIncludeFilter(pattern string) filterFunc {
includePattern := strings.Split(pattern, ";")
return func(tempMap map[string]string) (map[string]string, error) {
result := make(map[string]string)
for k, v := range tempMap {
for _, filterPattern := range includePattern {
matched, err := filepath.Match(strings.ToLower(filterPattern), strings.ToLower(strings.TrimPrefix(k, buildInfoPrefix)))
if errorutils.CheckError(err) != nil {
return nil, err
}
if matched {
result[k] = v
break
}
}
}
return result, nil
}
}
func createExcludeFilter(pattern string) filterFunc {
excludePattern := strings.Split(pattern, ";")
return func(tempMap map[string]string) (map[string]string, error) {
result := make(map[string]string)
for k, v := range tempMap {
include := true
for _, filterPattern := range excludePattern {
matched, err := filepath.Match(strings.ToLower(filterPattern), strings.ToLower(strings.TrimPrefix(k, buildInfoPrefix)))
if errorutils.CheckError(err) != nil {
return nil, err
}
if matched {
include = false
break
}
}
if include {
result[k] = v
}
}
return result, nil
}
}
Hi,
Various parts of this library allow you to Create
, Update
, and Delete
objects via the API. However, they do not allow you to Read
the objects back. Examples of this would be the accesskeys
and entitlements
implementations. This severely limits this libraries use.
There are Show
methods, but they make the odd choice (considering this is a library) to dump JSON to stdout instead of returning the object to the caller.
Without the Read
methods, it is difficult for a user of the library to know if an object exists before trying to Create
or Update
it, etc, unless they re-implement chunks of the API to fetch them object themselves.
This issue should be considered a feature request to add the missing Read
methods.
Thanks.
HI, the call
rtDetails := auth.NewArtifactoryDetails()
rtDetails.SetUrl("https://my.artifactory-endpoint.com/artifactory/")
rtDetails.SetUser("admin")
rtDetails.SetPassword("mypasswd")
artconfig, err := artifactory.NewConfigBuilder().SetArtDetails(rtDetails).SetThreads(3).SetDryRun(false).Build()
if err != nil {
panic(err)
}
cli, err := artifactory.New(&rtDetails, artconfig)
if err != nil {
panic(err)
}
_, err = cli.Ping()
if err != nil {
panic(err)
}
fmt.Println(cli.GetConfig().GetUrl())
causes a goroutine stack exceeds (infinite recursion I guess)
goroutine 1 [running]:
github.com/jfrog/jfrog-client-go/artifactory.(*artifactoryServicesConfig).GetUrl(0x9c94960, 0x0, 0x0)
/home/susanna/go/pkg/mod/github.com/jfrog/[email protected]/artifactory/config.go:29 +0x3a fp=0x12400368 sp=0x12400364 pc=0x8548eaa
github.com/jfrog/jfrog-client-go/artifactory.(*artifactoryServicesConfig).GetUrl(0x9c94960, 0x0, 0x0)
/home/susanna/go/pkg/mod/github.com/jfrog/[email protected]/artifactory/config.go:30 +0x21 fp=0x12400378 sp=0x12400368 pc=0x8548e91
github.com/jfrog/jfrog-client-go/artifactory.(*artifactoryServicesConfig).GetUrl(0x9c94960, 0x0, 0x0)
/home/susanna/go/pkg/mod/github.com/jfrog/[email protected]/artifactory/config.go:30 +0x21 fp=0x12400388 sp=0x12400378 pc=0x8548e91
github.com/jfrog/jfrog-client-go/artifactory.(*artifactoryServicesConfig).GetUrl(0x9c94960, 0x0, 0x0)
I'm using v0.4.0.
Thanks
Hello,
In artifactory UI, when creating a permission there is a Destination section.
I don"t found in the go client where i can manipulate this data (create/update/delete).
The structure PermissionTargetParams do not contains the Destination section
// Using struct pointers to keep the fields null if they are empty.
// Artifactory evaluates inner struct typed fields if they are not null, which can lead to failures in the request.
type PermissionTargetParams struct {
Name string `json:"name"`
Repo *PermissionTargetSection `json:"repo,omitempty"`
Build *PermissionTargetSection `json:"build,omitempty"`
ReleaseBundle *PermissionTargetSection `json:"releaseBundle,omitempty"`
}
There is another way to do this? or it's just missing for now and will be added in the future ?
Why jfrog-client is forcing to use log. I am getting the below error while using httpclient (github.com/jfrog/jfrog-client-go/http/httpclient) and httputils (github.com/jfrog/jfrog-client-go/utils/io/httputils).
Logger not initialized. See API documentation.
../github.com/jfrog/[email protected]/utils/log/logger.go:88 (0xdeb3ae)
validateLogInit: panic("Logger not initialized. See API documentation.")
../github.com/jfrog/[email protected]/utils/log/logger.go:93 (0xdeb3e4)
Debug: validateLogInit()
../github.com/jfrog/[email protected]/http/httpclient/client.go:88 (0xdf0a84)
(*HttpClient).Send: log.Debug(fmt.Sprintf("Sending HTTP %s request to: %s", method, URL))
../github.com/jfrog/[email protected]/http/httpclient/client.go:51 (0xdef9d7)
Once I am using log ("github.com/jfrog/jfrog-client-go/utils/log") and setting the log like this
jfroglog.SetLogger(jfroglog.NewLogger(2, os.Stderr))
, it works fine.
Are there plans to add support for the various access token capabilities via the REST API?
As documented here: https://www.jfrog.com/confluence/display/ACC/Access+Tokens#AccessTokens-RESTAPI
Hello,
There are a missing variable in httpclient :
# github.com/jfrog/jfrog-client-go/httpclient
$GOPATH/pkg/mod/github.com/jfrog/[email protected]/httpclient/client.go:311:10: undefined: archiver.MatchingFormat
$GOPATH/pkg/mod/github.com/jfrog/[email protected]/httpclient/client.go:386:12: arch.Read undefined (type archiver.Archiver has no field or method Read)
$GOPATH/pkg/mod/github.com/jfrog/[email protected]/httpclient/client.go:400:20: invalid method expression archiver.Zip.Open (needs pointer receiver: (*archiver.Zip).Open)
$GOPATH/pkg/mod/github.com/jfrog/[email protected]/httpclient/client.go:623:10: undefined: archiver.MatchingFormat
Thanks in advance for the fix.
It looks like the SetProps and DeleteProps props APIs require using the SearchFiles API. The SetProps and DeleteProps API expect to receive to result of the SearchFiles.
This is both inconsistent with the other APIs (which are all independent) and also cumbersome to use.
In addition, the README is incorrect, because it notes that propsParams includes a Pattern property, while it doesn't, right now, although it should.
Describe the bug
When using the api/storage endpoint to retrieve information about an artifact (specifically its downloadURI)
The URI schema returned does not match the URI schema used to contact artifactory
To Reproduce
curl -u user:password https://<artifactory_address>/artifactory/api/storage/<repository_name>/<file_path>
response:
{
"repo" : "repository_name",
"path" : "file_path",
"created" : "2020-11-04T03:20:30.406-08:00",
"createdBy" : "user",
"lastModified" : "2020-11-04T03:20:29.193-08:00",
"modifiedBy" : "user",
"lastUpdated" : "2020-11-04T03:20:30.406-08:00",
"downloadUri" : "http://artifactory_address/artifactory/repository_name/file_path",
"mimeType" : "application/x-gzip",
"size" : "size",
"checksums" : {
"sha1" : "hash",
"md5" : "hash",
"sha256" : "hash"
},
"originalChecksums" : {
"sha256" : "hash"
},
"uri" : "http://artifactory_address/artifactory/api/storage/repository_name/file_path"
}
Expected behavior
When accessing artifactory using https, I expect the returned downloadURI to have an https schema.
Screenshots
If applicable, add screenshots to help explain your problem.
Versions
Additional context
I couldn't find where to open this issue, this might not be suitable since I'm not using the go sdk per se
We can set the environment variable $TMPDIR
which will be retrieved by tempDirBase = os.TempDir()
, later on we only check if the value is not an empty string. Setting $TMPDIR
to a non-existant path will cause this to fail when we attempt to create temp dirs in https://github.com/jfrog/jfrog-client-go/blob/master/utils/io/fileutils/temp.go#L37
Should we not verify/create the path specified in tempDirBase
before attempting to use it in ioutil.TempDir
? I'm not sure if this is intentional or not, hence the question.
Describe the bug
Following the merge of #211 we should refactor the code, so that the new Xray APIs introduced in this PR do not use the ArtifactoryClientBuilder. We should either create a generic builder for all JFrog services, or alternatively create client APIs for Xray.
See the following comment as part of the above PR:
Now that ArtifactoryClientBuilder also needs to be used for Xray, we should rename it to HttpClientBuilder.
We should also move the httpclient package, which is currently located under the artifactory directory, to be one level up, next to the artifactory dir.
rthttpclient should be renamed to httpclient, or if the the httpclient is already taken as an alias in the file, maybe jfroghttpclient.
To Reproduce
N/A
Expected behavior
N/A
Screenshots
N/A
Versions
I tried following the examples in the README to download an artifact but kept getting the following error:
[Error] [Thread 2] Received an error: Function cannot be used before 'tempDirPath' is created.
I had to call fileutils.CreateTempDirPath() before the download works.
Please update the documentation or update the flow to call fileutils.CreateTempDirPath() within DownloadFiles.
The documentation is limited so would be best if you create an end to end example/test using
ArtifactoryServicesManager.
It seems like both Xray manger and Artifactory manger initialization function may receive the auth.ServiceDetails
twice.
Directly, and as part of the Config struct. I couldn't find a good reason for this design that could led to inconsistent behavior.
Please look on the attached usage of the Xray manager:
func (ds *xrayDetails) getXrayVersion() (string, error) {
cd := auth.ServiceDetails(ds)
serviceConfig, err := config.NewConfigBuilder(). // BTW this err is being ignored.
SetServiceDetails(cd).
SetCertificatesPath(cd.GetClientCertPath()).
Build()
sm, err := xray.New(&cd, serviceConfig) // The auth.ServiceDetails is passed twice to this initialization func
Hello,
Unless I am mistaken, it is not possible with your lib to specify the complete configuration of the http client that you want. For example, defining the context, ciphers, curved, dialer, ... is not possible.
Also, would you be able to expose a method to set the * http.Client pointer and not just some sporadic options?
Thank you in advance.
Regards.
A declarative, efficient, and flexible JavaScript library for building user interfaces.
๐ Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. ๐๐๐
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google โค๏ธ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.