[#351] pkg/container: Implement functions to work with native names
Implement `GetNativeNameWithZone` / `SetNativeNameWithZone` function which gets / sets `__NEOFS_NAME` and `__NEOFS_ZONE` container attributes. Signed-off-by: Leonard Lyubich <leonard@nspcc.ru>
This commit is contained in:
parent
7348dee623
commit
20b863284a
2 changed files with 76 additions and 0 deletions
|
@ -74,3 +74,57 @@ func (a Attributes) ToV2() []*container.Attribute {
|
|||
|
||||
return attrs
|
||||
}
|
||||
|
||||
// sets value of the attribute by key.
|
||||
func setAttribute(c *Container, key, value string) {
|
||||
var a *Attribute
|
||||
|
||||
iterateAttributes(c, func(a_ *Attribute) bool {
|
||||
if a_.Key() == key {
|
||||
a = a_
|
||||
}
|
||||
|
||||
return a != nil
|
||||
})
|
||||
|
||||
if a == nil {
|
||||
a = NewAttribute()
|
||||
a.SetKey(key)
|
||||
|
||||
c.SetAttributes(append(c.Attributes(), a))
|
||||
}
|
||||
|
||||
a.SetValue(value)
|
||||
}
|
||||
|
||||
// iterates over container attributes. Stops at f's true return.
|
||||
//
|
||||
// Handler must not be nil.
|
||||
func iterateAttributes(c *Container, f func(*Attribute) bool) {
|
||||
for _, a := range c.Attributes() {
|
||||
if f(a) {
|
||||
return
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// SetNativeNameWithZone sets container native name and its zone.
|
||||
func SetNativeNameWithZone(c *Container, name, zone string) {
|
||||
setAttribute(c, container.SysAttributeName, name)
|
||||
setAttribute(c, container.SysAttributeZone, zone)
|
||||
}
|
||||
|
||||
// GetNativeNameWithZone returns container native name and its zone.
|
||||
func GetNativeNameWithZone(c *Container) (name string, zone string) {
|
||||
iterateAttributes(c, func(a *Attribute) bool {
|
||||
if key := a.Key(); key == container.SysAttributeName {
|
||||
name = a.Value()
|
||||
} else if key == container.SysAttributeZone {
|
||||
zone = a.Value()
|
||||
}
|
||||
|
||||
return name != "" && zone != ""
|
||||
})
|
||||
|
||||
return
|
||||
}
|
||||
|
|
|
@ -118,3 +118,25 @@ func TestNewAttributeFromV2(t *testing.T) {
|
|||
require.Nil(t, container.NewAttributeFromV2(x))
|
||||
})
|
||||
}
|
||||
|
||||
func TestGetNameWithZone(t *testing.T) {
|
||||
c := container.New()
|
||||
|
||||
for _, item := range [...]struct {
|
||||
name, zone string
|
||||
}{
|
||||
{"name1", ""},
|
||||
{"name1", "zone1"},
|
||||
{"name2", "zone1"},
|
||||
{"name2", "zone2"},
|
||||
{"", "zone2"},
|
||||
{"", ""},
|
||||
} {
|
||||
container.SetNativeNameWithZone(c, item.name, item.zone)
|
||||
|
||||
name, zone := container.GetNativeNameWithZone(c)
|
||||
|
||||
require.Equal(t, item.name, name, item.name)
|
||||
require.Equal(t, item.zone, zone, item.zone)
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue