Admin Panel

from amitools.vamos.path import AssignManager, VolumeManager
from amitools.vamos.cfgcore import ConfigDict


def setup_am(my_path):
  v = VolumeManager()
  v.add_volume("bla:" + my_path)
  a = AssignManager(v)
  return a


def path_assign_add_del_test(tmpdir):
  my_path = str(tmpdir)
  a = setup_am(my_path)
  a.setup()
  # invalid
  assert not a.add_assign('')
  assert not a.add_assign('foo')
  assert not a.add_assign('foo:')
  # volume of same name
  assert not a.add_assign('bla:foo:')
  assert not a.add_assign('BLA:foo:')
  # ok
  assert a.add_assign('foo:bla:')
  assert a.is_assign('foo')
  assert a.is_assign('FOO')
  assert a.is_assign('Foo')
  assert a.get_all_names() == ['foo']
  assert a.get_assign('Foo').get_assigns() == ['bla:']
  # ok
  assert a.add_assign('Baz:foo:bla/blup')
  assert a.is_assign('baz')
  assert a.is_assign('BAZ')
  assert a.get_all_names() == ['foo', 'Baz']
  assert a.get_assign('baz').get_assigns() == ['foo:bla/blup']
  # invalid path
  assert not a.add_assign('bar:bla')
  # duplicate
  assert not a.add_assign('foo:blub:')
  assert not a.add_assign('FOO:blub:')
  # del foo
  assert a.del_assign('foo')
  # not found
  assert not a.del_assign('bar')
  a.shutdown()


def path_assign_add_multi_test(tmpdir):
  my_path = str(tmpdir)
  a = setup_am(my_path)
  # add multiple assigns
  a1 = a.add_assign('foo:bla:+bla:tmp')
  assert a1
  assert a1.get_assigns() == ['bla:', 'bla:tmp']
  # replace foo
  a2 = a.add_assign('foo:bla:pop')
  assert a2
  assert a2.get_assigns() == ['bla:pop']
  # append
  a3 = a.add_assign('foo:+bla:pip')
  assert a3
  assert a2 is a3
  assert a3.get_assigns() == ['bla:pop', 'bla:pip']
  # try setup
  assert a.setup()
  a.shutdown()


def path_assign_resolve_test(tmpdir):
  my_path = str(tmpdir)
  a = setup_am(my_path)
  a.setup()
  a.add_assign('Foo:blA:blub')
  a.add_assign('Baz:foo:bla/plop')
  a.add_assign('multi:foo:tmp+baz:')
  ar = a.resolve_assigns
  # relative paths
  assert ar('rel/path') == 'rel/path'
  assert ar(':rel/path') == ':rel/path'
  # volume path
  assert ar('Bla:abs/path') == 'Bla:abs/path'
  assert ar('BLA:abs/path') == 'BLA:abs/path'
  assert ar('bla:abs/path') == 'bla:abs/path'
  # single assign
  assert ar('Foo:my/path') == 'blA:blub/my/path'
  assert ar('foo:my/path') == 'blA:blub/my/path'
  # single assign recursive
  assert ar('baz:my/path') == 'blA:blub/bla/plop/my/path'
  # multi assign
  assert ar('multi:my/path') == ['blA:blub/tmp/my/path',
                                 'blA:blub/bla/plop/my/path']
  # not an assign
  assert ar('what:is/here') == 'what:is/here'
  # non recursive
  assert ar('Baz:', False) == 'foo:bla/plop'
  assert ar('MULTI:', False) == ['foo:tmp', 'baz:']
  a.shutdown()


def path_assign_resolve_as_list_test(tmpdir):
  my_path = str(tmpdir)
  a = setup_am(my_path)
  a.setup()
  a.add_assign('Foo:blA:blub')
  a.add_assign('Baz:foo:bla/plop')
  a.add_assign('multi:foo:tmp+baz:')

  def ar(path, recursive=True):
    return a.resolve_assigns(path, recursive, as_list=True)
  # relative paths
  assert ar('rel/path') == ['rel/path']
  assert ar(':rel/path') == [':rel/path']
  # volume path
  assert ar('Bla:abs/path') == ['Bla:abs/path']
  assert ar('BLA:abs/path') == ['BLA:abs/path']
  assert ar('bla:abs/path') == ['bla:abs/path']
  # single assign
  assert ar('Foo:my/path') == ['blA:blub/my/path']
  assert ar('foo:my/path') == ['blA:blub/my/path']
  # single assign recursive
  assert ar('baz:my/path') == ['blA:blub/bla/plop/my/path']
  # multi assign
  assert ar('multi:my/path') == ['blA:blub/tmp/my/path',
                                 'blA:blub/bla/plop/my/path']
  # not an assign
  assert ar('what:is/here') == ['what:is/here']
  # non recursive
  assert ar('Baz:', False) == ['foo:bla/plop']
  assert ar('MULTI:', False) == ['foo:tmp', 'baz:']
  a.shutdown()


def path_assign_config_test(tmpdir):
  my_path = str(tmpdir)
  a = setup_am(my_path)
  cfg = ConfigDict({
      "assigns": [
          "Foo:blA:blub",
          "Baz:foo:bla/plop",
          "multi:foo:tmp+baz:"
      ]
  })
  assert a.parse_config(cfg)
  a.setup()
  ar = a.resolve_assigns
  # relative paths
  assert ar('rel/path') == 'rel/path'
  assert ar(':rel/path') == ':rel/path'
  # volume path
  assert ar('Bla:abs/path') == 'Bla:abs/path'
  assert ar('BLA:abs/path') == 'BLA:abs/path'
  assert ar('bla:abs/path') == 'bla:abs/path'
  # single assign
  assert ar('Foo:my/path') == 'blA:blub/my/path'
  assert ar('foo:my/path') == 'blA:blub/my/path'
  # single assign recursive
  assert ar('baz:my/path') == 'blA:blub/bla/plop/my/path'
  # multi assign
  assert ar('multi:my/path') == ['blA:blub/tmp/my/path',
                                 'blA:blub/bla/plop/my/path']
  # not an assign
  assert ar('what:is/here') == 'what:is/here'
  a.shutdown()


def path_assign_cfg_create_test(tmpdir):
  my_path = str(tmpdir)
  a = setup_am(my_path)
  a.setup()
  # no dir created
  assert a.add_assign("foo:bla:blub")
  assert not tmpdir.join("blub").check(dir=1)
  # dir created
  assert a.add_assign("bar:bla:blub?create")
  assert tmpdir.join("blub").check(dir=1)
  a.shutdown()