Merge pull request #891 from ipfs/feat/metadata
Metadata can be set and shown from `ctl`
This commit is contained in:
commit
9eb0deee4e
25
api/add.go
25
api/add.go
|
@ -61,6 +61,7 @@ func DefaultAddParams() *AddParams {
|
||||||
ReplicationFactorMax: 0,
|
ReplicationFactorMax: 0,
|
||||||
Name: "",
|
Name: "",
|
||||||
ShardSize: DefaultShardSize,
|
ShardSize: DefaultShardSize,
|
||||||
|
Metadata: make(map[string]string),
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -152,6 +153,17 @@ func AddParamsFromQuery(query url.Values) (*AddParams, error) {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
for k := range query {
|
||||||
|
if !strings.HasPrefix(k, pinOptionsMetaPrefix) {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
metaKey := strings.TrimPrefix(k, pinOptionsMetaPrefix)
|
||||||
|
if metaKey == "" {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
params.Metadata[metaKey] = query.Get(k)
|
||||||
|
}
|
||||||
|
|
||||||
allocs := query.Get("user-allocations")
|
allocs := query.Get("user-allocations")
|
||||||
if allocs != "" {
|
if allocs != "" {
|
||||||
params.UserAllocations = StringsToPeers(strings.Split(allocs, ","))
|
params.UserAllocations = StringsToPeers(strings.Split(allocs, ","))
|
||||||
|
@ -189,6 +201,12 @@ func (p *AddParams) ToQueryString() string {
|
||||||
query.Set("replication-min", fmt.Sprintf("%d", p.ReplicationFactorMin))
|
query.Set("replication-min", fmt.Sprintf("%d", p.ReplicationFactorMin))
|
||||||
query.Set("replication-max", fmt.Sprintf("%d", p.ReplicationFactorMax))
|
query.Set("replication-max", fmt.Sprintf("%d", p.ReplicationFactorMax))
|
||||||
query.Set("name", p.Name)
|
query.Set("name", p.Name)
|
||||||
|
for k, v := range p.Metadata {
|
||||||
|
if k == "" {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
query.Set(fmt.Sprintf("%s%s", pinOptionsMetaPrefix, k), v)
|
||||||
|
}
|
||||||
query.Set("user-allocations", strings.Join(PeersToStrings(p.UserAllocations), ","))
|
query.Set("user-allocations", strings.Join(PeersToStrings(p.UserAllocations), ","))
|
||||||
query.Set("shard", fmt.Sprintf("%t", p.Shard))
|
query.Set("shard", fmt.Sprintf("%t", p.Shard))
|
||||||
query.Set("shard-size", fmt.Sprintf("%d", p.ShardSize))
|
query.Set("shard-size", fmt.Sprintf("%d", p.ShardSize))
|
||||||
|
@ -208,6 +226,13 @@ func (p *AddParams) ToQueryString() string {
|
||||||
|
|
||||||
// Equals checks if p equals p2.
|
// Equals checks if p equals p2.
|
||||||
func (p *AddParams) Equals(p2 *AddParams) bool {
|
func (p *AddParams) Equals(p2 *AddParams) bool {
|
||||||
|
for k, v := range p.Metadata {
|
||||||
|
v2 := p2.Metadata[k]
|
||||||
|
if k != "" && v != v2 {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return p.ReplicationFactorMin == p2.ReplicationFactorMin &&
|
return p.ReplicationFactorMin == p2.ReplicationFactorMin &&
|
||||||
p.ReplicationFactorMax == p2.ReplicationFactorMax &&
|
p.ReplicationFactorMax == p2.ReplicationFactorMax &&
|
||||||
p.Name == p2.Name &&
|
p.Name == p2.Name &&
|
||||||
|
|
|
@ -188,7 +188,14 @@ func textFormatPrintPin(obj *api.Pin) {
|
||||||
recStr = fmt.Sprintf("Recursive-%d", obj.MaxDepth)
|
recStr = fmt.Sprintf("Recursive-%d", obj.MaxDepth)
|
||||||
}
|
}
|
||||||
|
|
||||||
fmt.Printf(" | %s\n", recStr)
|
fmt.Printf(" | %s", recStr)
|
||||||
|
|
||||||
|
fmt.Printf(" | Metadata:")
|
||||||
|
if len(obj.Metadata) == 0 {
|
||||||
|
fmt.Printf(" no\n")
|
||||||
|
} else {
|
||||||
|
fmt.Printf(" yes\n")
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func textFormatPrintAddedOutput(obj *api.AddedOutput) {
|
func textFormatPrintAddedOutput(obj *api.AddedOutput) {
|
||||||
|
|
|
@ -309,7 +309,7 @@ cluster "pin add".
|
||||||
},
|
},
|
||||||
cli.BoolFlag{
|
cli.BoolFlag{
|
||||||
Name: "wrap-with-directory, w",
|
Name: "wrap-with-directory, w",
|
||||||
Usage: "Wrap a with a directory object.",
|
Usage: "Wrap a with a directory object",
|
||||||
},
|
},
|
||||||
cli.BoolFlag{
|
cli.BoolFlag{
|
||||||
Name: "hidden, H",
|
Name: "hidden, H",
|
||||||
|
@ -331,7 +331,7 @@ cluster "pin add".
|
||||||
},
|
},
|
||||||
cli.StringFlag{
|
cli.StringFlag{
|
||||||
Name: "hash",
|
Name: "hash",
|
||||||
Usage: "Hash function to use. Implies cid-version=1.",
|
Usage: "Hash function to use. Implies cid-version=1",
|
||||||
Value: defaultAddParams.HashFun,
|
Value: defaultAddParams.HashFun,
|
||||||
},
|
},
|
||||||
cli.StringFlag{
|
cli.StringFlag{
|
||||||
|
@ -349,6 +349,10 @@ cluster "pin add".
|
||||||
Value: defaultAddParams.ReplicationFactorMax,
|
Value: defaultAddParams.ReplicationFactorMax,
|
||||||
Usage: "Sets the maximum replication factor for pinning this file",
|
Usage: "Sets the maximum replication factor for pinning this file",
|
||||||
},
|
},
|
||||||
|
cli.StringSliceFlag{
|
||||||
|
Name: "metadata",
|
||||||
|
Usage: "Pin metadata: key=value. Can be added multiple times",
|
||||||
|
},
|
||||||
cli.StringFlag{
|
cli.StringFlag{
|
||||||
Name: "allocations, allocs",
|
Name: "allocations, allocs",
|
||||||
Usage: "Optional comma-separated list of peer IDs",
|
Usage: "Optional comma-separated list of peer IDs",
|
||||||
|
@ -400,6 +404,7 @@ cluster "pin add".
|
||||||
p := api.DefaultAddParams()
|
p := api.DefaultAddParams()
|
||||||
p.ReplicationFactorMin = c.Int("replication-min")
|
p.ReplicationFactorMin = c.Int("replication-min")
|
||||||
p.ReplicationFactorMax = c.Int("replication-max")
|
p.ReplicationFactorMax = c.Int("replication-max")
|
||||||
|
p.Metadata = parseMetadata(c.StringSlice("metadata"))
|
||||||
p.Name = name
|
p.Name = name
|
||||||
if c.String("allocations") != "" {
|
if c.String("allocations") != "" {
|
||||||
p.UserAllocations = api.StringsToPeers(strings.Split(c.String("allocations"), ","))
|
p.UserAllocations = api.StringsToPeers(strings.Split(c.String("allocations"), ","))
|
||||||
|
@ -524,6 +529,10 @@ would stil be respected.
|
||||||
Value: "",
|
Value: "",
|
||||||
Usage: "Sets a name for this pin",
|
Usage: "Sets a name for this pin",
|
||||||
},
|
},
|
||||||
|
cli.StringSliceFlag{
|
||||||
|
Name: "metadata",
|
||||||
|
Usage: "Pin metadata: key=value. Can be added multiple times",
|
||||||
|
},
|
||||||
cli.BoolFlag{
|
cli.BoolFlag{
|
||||||
Name: "no-status, ns",
|
Name: "no-status, ns",
|
||||||
Usage: "Prevents fetching pin status after pinning (faster, quieter)",
|
Usage: "Prevents fetching pin status after pinning (faster, quieter)",
|
||||||
|
@ -565,6 +574,7 @@ would stil be respected.
|
||||||
ReplicationFactorMax: rplMax,
|
ReplicationFactorMax: rplMax,
|
||||||
Name: c.String("name"),
|
Name: c.String("name"),
|
||||||
UserAllocations: userAllocs,
|
UserAllocations: userAllocs,
|
||||||
|
Metadata: parseMetadata(c.StringSlice("metadata")),
|
||||||
}
|
}
|
||||||
|
|
||||||
pin, cerr := globalClient.PinPath(ctx, arg, opts)
|
pin, cerr := globalClient.PinPath(ctx, arg, opts)
|
||||||
|
@ -1075,6 +1085,19 @@ func waitFor(
|
||||||
return client.WaitFor(ctx, globalClient, fp)
|
return client.WaitFor(ctx, globalClient, fp)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func parseMetadata(metadata []string) map[string]string {
|
||||||
|
metadataMap := make(map[string]string)
|
||||||
|
for _, str := range metadata {
|
||||||
|
parts := strings.SplitN(str, "=", 2)
|
||||||
|
if len(parts) != 2 {
|
||||||
|
checkErr("parsing metadata", errors.New("metadata were not in the format key=value"))
|
||||||
|
}
|
||||||
|
metadataMap[parts[0]] = parts[1]
|
||||||
|
}
|
||||||
|
|
||||||
|
return metadataMap
|
||||||
|
}
|
||||||
|
|
||||||
// func setupTracing(config tracingConfig) {
|
// func setupTracing(config tracingConfig) {
|
||||||
// if !config.Enable {
|
// if !config.Enable {
|
||||||
// return
|
// return
|
||||||
|
|
|
@ -96,6 +96,16 @@ test_expect_success IPFS,CLUSTER "pin update a pin" '
|
||||||
ipfs-cluster-ctl pin ls $cid2
|
ipfs-cluster-ctl pin ls $cid2
|
||||||
'
|
'
|
||||||
|
|
||||||
|
test_expect_success IPFS,CLUSTER "pin with metadata" '
|
||||||
|
cid3=`docker exec ipfs sh -c "echo test3 | ipfs add -q"`
|
||||||
|
ipfs-cluster-ctl pin add --metadata kind=text "$cid3"
|
||||||
|
cid4=`docker exec ipfs sh -c "echo test4 | ipfs add -q"`
|
||||||
|
ipfs-cluster-ctl pin add "$cid4"
|
||||||
|
ipfs-cluster-ctl pin ls "$cid3" | grep -q "Metadata: yes" &&
|
||||||
|
ipfs-cluster-ctl --enc=json pin ls "$cid3" | jq .metadata | grep -q "\"kind\": \"text\"" &&
|
||||||
|
ipfs-cluster-ctl pin ls "$cid4" | grep -q "Metadata: no"
|
||||||
|
'
|
||||||
|
|
||||||
test_clean_ipfs
|
test_clean_ipfs
|
||||||
test_clean_cluster
|
test_clean_cluster
|
||||||
|
|
||||||
|
|
|
@ -79,6 +79,16 @@ test_expect_success IPFS,CLUSTER "check pin after locally added" '
|
||||||
ipfs-cluster-ctl pin ls | grep -q -i "$cid"
|
ipfs-cluster-ctl pin ls | grep -q -i "$cid"
|
||||||
'
|
'
|
||||||
|
|
||||||
|
test_expect_success IPFS,CLUSTER "add with metadata" '
|
||||||
|
echo "test1" > test1.txt
|
||||||
|
cid1=`ipfs-cluster-ctl add --quieter --metadata kind=text test1.txt`
|
||||||
|
echo "test2" > test2.txt
|
||||||
|
cid2=`ipfs-cluster-ctl add --quieter test2.txt`
|
||||||
|
ipfs-cluster-ctl pin ls "$cid1" | grep -q "Metadata: yes" &&
|
||||||
|
ipfs-cluster-ctl --enc=json pin ls "$cid1" | jq .metadata | grep -q "\"kind\": \"text\"" &&
|
||||||
|
ipfs-cluster-ctl pin ls "$cid2" | grep -q "Metadata: no"
|
||||||
|
'
|
||||||
|
|
||||||
test_clean_ipfs
|
test_clean_ipfs
|
||||||
test_clean_cluster
|
test_clean_cluster
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue
Block a user