On Apr 16 15:19, Ilias Tsitsimpis wrote:
> Fix the unittest that have been broken when we lifted the Disk objects
> from the Instances.
>
> Signed-off-by: Ilias Tsitsimpis <[email protected]>
> ---
> lib/config.py | 2 +-
> test/data/instance-disks.txt | 66 +---------------------------
> test/hs/Test/Ganeti/Objects.hs | 2 +-
> test/py/cmdlib/cluster_unittest.py | 16 ++++---
> test/py/cmdlib/cmdlib_unittest.py | 13 +++---
> test/py/cmdlib/instance_unittest.py | 72
> ++++++++++++++++++-------------
> test/py/cmdlib/testsupport/config_mock.py | 7 ++-
> test/py/ganeti.config_unittest.py | 25 ++++++-----
> test/py/ganeti.rpc_unittest.py | 26 ++++++++---
> 9 files changed, 103 insertions(+), 126 deletions(-)
>
> diff --git a/lib/config.py b/lib/config.py
> index 0dd8650..629e5ba 100644
> --- a/lib/config.py
> +++ b/lib/config.py
> @@ -1105,7 +1105,7 @@ class ConfigWriter(object):
> result.append("Instance '%s' has invalid disk '%s'" %
> (instance.name, disk_uuid))
>
> - instance_disks = self._UnlockedGetInstanceDisks(instance)
> + instance_disks = self._UnlockedGetInstanceDisks(instance.uuid)
> # gather the drbd ports for duplicate checks
> for (idx, dsk) in enumerate(instance_disks):
> if dsk.dev_type in constants.DTS_DRBD:
> diff --git a/test/data/instance-disks.txt b/test/data/instance-disks.txt
> index 67568c2..51cf1a1 100644
> --- a/test/data/instance-disks.txt
> +++ b/test/data/instance-disks.txt
> @@ -2,71 +2,7 @@
> "beparams": {},
> "ctime": 1372838883.9710441,
> "disk_template": "drbd",
> - "disks": [
> - {
> - "children": [
> - {
> - "dev_type": "plain",
> - "logical_id": [
> - "xenvg",
> - "df9ff3f6-a833-48ff-8bd5-bff2eaeab759.disk0_data"
> - ],
> - "params": {},
> - "physical_id": [
> - "xenvg",
> - "df9ff3f6-a833-48ff-8bd5-bff2eaeab759.disk0_data"
> - ],
> - "size": 1024,
> - "uuid": "eaff6322-1bfb-4d59-b306-4535730917cc",
> - "serial_no": 1,
> - "ctime": 1372838946.2599809,
> - "mtime": 1372838946.2599809
> - },
> - {
> - "dev_type": "plain",
> - "logical_id": [
> - "xenvg",
> - "df9ff3f6-a833-48ff-8bd5-bff2eaeab759.disk0_meta"
> - ],
> - "params": {},
> - "physical_id": [
> - "xenvg",
> - "df9ff3f6-a833-48ff-8bd5-bff2eaeab759.disk0_meta"
> - ],
> - "size": 128,
> - "uuid": "bf512e95-2a49-4cb3-8d1f-30a503f6bf1b",
> - "serial_no": 1,
> - "ctime": 1372838946.2599809,
> - "mtime": 1372838946.2599809
> - }
> - ],
> - "dev_type": "drbd",
> - "iv_name": "disk/0",
> - "logical_id": [
> - "60e687a0-21fc-4577-997f-ccd08925fa65",
> - "c739c7f3-79d8-4e20-ac68-662e16577d2e",
> - 11000,
> - 0,
> - 0,
> - "9bdb15fb7ab6bb4610a313d654ed4d0d2433713e"
> - ],
> - "mode": "rw",
> - "params": {},
> - "physical_id": [
> - "172.16.241.3",
> - 11000,
> - "172.16.241.2",
> - 11000,
> - 0,
> - "9bdb15fb7ab6bb4610a313d654ed4d0d2433713e"
> - ],
> - "size": 1024,
> - "uuid": "5d61e205-bf89-4ba8-a319-589b7bb7419e",
> - "serial_no": 1,
> - "ctime": 1372838946.2599809,
> - "mtime": 1372838946.2599809
> - }
> - ],
> + "disks": ["5d61e205-bf89-4ba8-a319-589b7bb7419e"],
> "disks_active": true,
> "hvparams": {},
> "hypervisor": "xen-pvm",
> diff --git a/test/hs/Test/Ganeti/Objects.hs b/test/hs/Test/Ganeti/Objects.hs
> index 8653fc5..0eefca9 100644
> --- a/test/hs/Test/Ganeti/Objects.hs
> +++ b/test/hs/Test/Ganeti/Objects.hs
> @@ -132,7 +132,7 @@ instance Arbitrary Instance where
> -- nics
> <*> arbitrary
> -- disks
> - <*> vectorOf 5 genDisk
> + <*> vectorOf 5 arbitrary
> -- disk template
> <*> arbitrary
> -- disks active
> diff --git a/test/py/cmdlib/cluster_unittest.py
> b/test/py/cmdlib/cluster_unittest.py
> index 1de19da..8a2699f 100644
> --- a/test/py/cmdlib/cluster_unittest.py
> +++ b/test/py/cmdlib/cluster_unittest.py
> @@ -1550,22 +1550,25 @@ class
> TestLUClusterVerifyGroupVerifyInstance(TestLUClusterVerifyGroupMethods):
> self.master_img.volumes = ["/".join(disk.logical_id)
> for inst in [self.running_inst,
> self.diskless_inst]
> - for disk in inst.disks]
> + for disk in
> + self.cfg.GetInstanceDisks(inst.uuid)]
> + drbd_inst_disks = self.cfg.GetInstanceDisks(self.drbd_inst.uuid)
> self.master_img.volumes.extend(
> - ["/".join(disk.logical_id) for disk in
> self.drbd_inst.disks[0].children])
> + ["/".join(disk.logical_id) for disk in drbd_inst_disks[0].children])
> self.master_img.instances = [self.running_inst.uuid]
> self.node1_img = \
> cluster.LUClusterVerifyGroup.NodeImage(uuid=self.node1.uuid)
> self.node1_img.volumes = \
> - ["/".join(disk.logical_id) for disk in
> self.drbd_inst.disks[0].children]
> + ["/".join(disk.logical_id) for disk in drbd_inst_disks[0].children]
> self.node_imgs = {
> self.master_uuid: self.master_img,
> self.node1.uuid: self.node1_img
> }
> + running_inst_disks = self.cfg.GetInstanceDisks(self.running_inst.uuid)
> self.diskstatus = {
> self.master_uuid: [
> (True, objects.BlockDevStatus(ldisk_status=constants.LDS_OKAY))
> - for _ in self.running_inst.disks
> + for _ in running_inst_disks
> ]
> }
>
> @@ -1633,7 +1636,10 @@ class
> TestLUClusterVerifyGroupVerifyInstance(TestLUClusterVerifyGroupMethods):
> @withLockedLU
> def testExclusiveStorageWithValidInstance(self, lu):
> self.master.ndparams[constants.ND_EXCLUSIVE_STORAGE] = True
> - self.running_inst.disks[0].spindles = 1
> + running_inst_disks = self.cfg.GetInstanceDisks(self.running_inst.uuid)
> + running_inst_disks[0].spindles = 1
> + feedback_fn = lambda _: None
> + self.cfg.Update(running_inst_disks[0], feedback_fn)
> lu._VerifyInstance(self.running_inst, self.node_imgs, self.diskstatus)
> self.mcpu.assertLogIsEmpty()
>
> diff --git a/test/py/cmdlib/cmdlib_unittest.py
> b/test/py/cmdlib/cmdlib_unittest.py
> index 499bf2a..354e83c 100755
> --- a/test/py/cmdlib/cmdlib_unittest.py
> +++ b/test/py/cmdlib/cmdlib_unittest.py
> @@ -591,6 +591,10 @@ class _FakeConfigForComputeIPolicyInstanceViolation:
> def GetInstanceNodes(self, instance_uuid):
> return ("pnode_uuid", )
>
> + def GetInstanceDisks(self, _):
> + disks = [objects.Disk(size=512, spindles=13, uuid="disk_uuid")]
> + return disks
return [objects.Disk(size=512, spindles=13, uuid="disk_uuid")]
Rest LGTM.
Thanks,
Jose
> +
>
> class TestComputeIPolicyInstanceViolation(unittest.TestCase):
> def test(self):
> @@ -599,18 +603,17 @@ class
> TestComputeIPolicyInstanceViolation(unittest.TestCase):
> constants.BE_VCPUS: 2,
> constants.BE_SPINDLE_USE: 4,
> }
> - disks = [objects.Disk(size=512, spindles=13)]
> cfg = _FakeConfigForComputeIPolicyInstanceViolation(beparams, False)
> - instance = objects.Instance(beparams=beparams, disks=disks, nics=[],
> - primary_node="pnode_uuid",
> + instance = objects.Instance(beparams=beparams, disks=["disk_uuid"],
> + nics=[], primary_node="pnode_uuid",
> disk_template=constants.DT_PLAIN)
> stub = _StubComputeIPolicySpecViolation(2048, 2, 1, 0, [512], 4,
> constants.DT_PLAIN)
> ret = common.ComputeIPolicyInstanceViolation(NotImplemented, instance,
> cfg, _compute_fn=stub)
> self.assertEqual(ret, [])
> - instance2 = objects.Instance(beparams={}, disks=disks, nics=[],
> - primary_node="pnode_uuid",
> + instance2 = objects.Instance(beparams={}, disks=["disk_uuid"],
> + nics=[], primary_node="pnode_uuid",
> disk_template=constants.DT_PLAIN)
> ret = common.ComputeIPolicyInstanceViolation(NotImplemented, instance2,
> cfg, _compute_fn=stub)
> diff --git a/test/py/cmdlib/instance_unittest.py
> b/test/py/cmdlib/instance_unittest.py
> index 67be24b..9504546 100644
> --- a/test/py/cmdlib/instance_unittest.py
> +++ b/test/py/cmdlib/instance_unittest.py
> @@ -32,6 +32,7 @@ import operator
>
> from ganeti import backend
> from ganeti import compat
> +from ganeti import config
> from ganeti import constants
> from ganeti import errors
> from ganeti import ht
> @@ -1054,7 +1055,7 @@ class TestGenerateDiskTemplate(CmdlibTestCase):
> self.assertTrue(disk.children is None)
>
> self._CheckIvNames(result, base_index, base_index + len(disk_info))
> - instance._UpdateIvNames(base_index, result)
> + config._UpdateIvNames(base_index, result)
> self._CheckIvNames(result, base_index, base_index + len(disk_info))
>
> return result
> @@ -1220,7 +1221,7 @@ class TestGenerateDiskTemplate(CmdlibTestCase):
> self.assertEqual(disk.children[1].size, constants.DRBD_META_SIZE)
>
> self._CheckIvNames(result, 0, len(disk_info))
> - instance._UpdateIvNames(0, result)
> + config._UpdateIvNames(0, result)
> self._CheckIvNames(result, 0, len(disk_info))
>
> self.assertEqual(map(operator.attrgetter("logical_id"), result), [
> @@ -1238,7 +1239,8 @@ class _DiskPauseTracker:
> self.history = []
>
> def __call__(self, (disks, instance), pause):
> - assert not (set(disks) - set(instance.disks))
> + disk_uuids = [d.uuid for d in disks]
> + assert not (set(disk_uuids) - set(instance.disks))
>
> self.history.extend((i.logical_id, i.size, pause)
> for i in disks)
> @@ -1247,13 +1249,17 @@ class _DiskPauseTracker:
>
>
> class _ConfigForDiskWipe:
> - def __init__(self, exp_node_uuid):
> + def __init__(self, exp_node_uuid, disks):
> self._exp_node_uuid = exp_node_uuid
> + self._disks = disks
>
> def GetNodeName(self, node_uuid):
> assert node_uuid == self._exp_node_uuid
> return "name.of.expected.node"
>
> + def GetInstanceDisks(self, _):
> + return self._disks
> +
>
> class _RpcForDiskWipe:
> def __init__(self, exp_node, pause_cb, wipe_cb):
> @@ -1311,20 +1317,20 @@ class TestWipeDisks(unittest.TestCase):
> def testPauseFailure(self):
> node_name = "node1372.example.com"
>
> - lu = _FakeLU(rpc=_RpcForDiskWipe(node_name, self._FailingPauseCb,
> - NotImplemented),
> - cfg=_ConfigForDiskWipe(node_name))
> -
> disks = [
> - objects.Disk(dev_type=constants.DT_PLAIN),
> - objects.Disk(dev_type=constants.DT_PLAIN),
> - objects.Disk(dev_type=constants.DT_PLAIN),
> + objects.Disk(dev_type=constants.DT_PLAIN, uuid="disk0"),
> + objects.Disk(dev_type=constants.DT_PLAIN, uuid="disk1"),
> + objects.Disk(dev_type=constants.DT_PLAIN, uuid="disk2"),
> ]
>
> + lu = _FakeLU(rpc=_RpcForDiskWipe(node_name, self._FailingPauseCb,
> + NotImplemented),
> + cfg=_ConfigForDiskWipe(node_name, disks))
> +
> inst = objects.Instance(name="inst21201",
> primary_node=node_name,
> disk_template=constants.DT_PLAIN,
> - disks=disks)
> + disks=[d.uuid for d in disks])
>
> self.assertRaises(errors.OpExecError, instance.WipeDisks, lu, inst)
>
> @@ -1337,21 +1343,22 @@ class TestWipeDisks(unittest.TestCase):
> node_uuid = "node13445-uuid"
> pt = _DiskPauseTracker()
>
> - lu = _FakeLU(rpc=_RpcForDiskWipe(node_uuid, pt, self._FailingWipeCb),
> - cfg=_ConfigForDiskWipe(node_uuid))
> -
> disks = [
> objects.Disk(dev_type=constants.DT_PLAIN, logical_id="disk0",
> - size=100 * 1024),
> + size=100 * 1024, uuid="disk0"),
> objects.Disk(dev_type=constants.DT_PLAIN, logical_id="disk1",
> - size=500 * 1024),
> - objects.Disk(dev_type=constants.DT_PLAIN, logical_id="disk2",
> size=256),
> + size=500 * 1024, uuid="disk1"),
> + objects.Disk(dev_type=constants.DT_PLAIN, logical_id="disk2",
> + size=256, uuid="disk2"),
> ]
>
> + lu = _FakeLU(rpc=_RpcForDiskWipe(node_uuid, pt, self._FailingWipeCb),
> + cfg=_ConfigForDiskWipe(node_uuid, disks))
> +
> inst = objects.Instance(name="inst562",
> primary_node=node_uuid,
> disk_template=constants.DT_PLAIN,
> - disks=disks)
> + disks=[d.uuid for d in disks])
>
> try:
> instance.WipeDisks(lu, inst)
> @@ -1376,23 +1383,25 @@ class TestWipeDisks(unittest.TestCase):
> progresst = _DiskWipeProgressTracker(start_offset)
>
> lu = _FakeLU(rpc=_RpcForDiskWipe(node_name, pauset, progresst),
> - cfg=_ConfigForDiskWipe(node_name))
> + cfg=_ConfigForDiskWipe(node_name, disks))
>
> instance = objects.Instance(name="inst3560",
> primary_node=node_name,
> disk_template=constants.DT_PLAIN,
> - disks=disks)
> + disks=[d.uuid for d in disks])
>
> return (lu, instance, pauset, progresst)
>
> def testNormalWipe(self):
> disks = [
> - objects.Disk(dev_type=constants.DT_PLAIN, logical_id="disk0",
> size=1024),
> + objects.Disk(dev_type=constants.DT_PLAIN, logical_id="disk0",
> + size=1024, uuid="disk0"),
> objects.Disk(dev_type=constants.DT_PLAIN, logical_id="disk1",
> - size=500 * 1024),
> - objects.Disk(dev_type=constants.DT_PLAIN, logical_id="disk2",
> size=128),
> + size=500 * 1024, uuid="disk1"),
> + objects.Disk(dev_type=constants.DT_PLAIN, logical_id="disk2",
> + size=128, uuid="disk2"),
> objects.Disk(dev_type=constants.DT_PLAIN, logical_id="disk3",
> - size=constants.MAX_WIPE_CHUNK),
> + size=constants.MAX_WIPE_CHUNK, uuid="disk3"),
> ]
>
> (lu, inst, pauset, progresst) = self._PrepareWipeTest(0, disks)
> @@ -1418,9 +1427,9 @@ class TestWipeDisks(unittest.TestCase):
> for start_offset in [0, 280, 8895, 1563204]:
> disks = [
> objects.Disk(dev_type=constants.DT_PLAIN, logical_id="disk0",
> - size=128),
> + size=128, uuid="disk0"),
> objects.Disk(dev_type=constants.DT_PLAIN, logical_id="disk1",
> - size=start_offset + (100 * 1024)),
> + size=start_offset + (100 * 1024), uuid="disk1"),
> ]
>
> (lu, inst, pauset, progresst) = \
> @@ -2325,9 +2334,12 @@ class TestLUInstanceSetParams(CmdlibTestCase):
> self.ExecOpCode(op)
>
> def testConvertDRBDToPlain(self):
> - self.inst.disks = [self.cfg.CreateDisk(dev_type=constants.DT_DRBD8,
> - primary_node=self.master,
> - secondary_node=self.snode)]
> + for disk_uuid in self.inst.disks:
> + self.cfg.RemoveInstanceDisk(self.inst.uuid, disk_uuid)
> + disk = self.cfg.CreateDisk(dev_type=constants.DT_DRBD8,
> + primary_node=self.master,
> + secondary_node=self.snode)
> + self.cfg.AddInstanceDisk(self.inst.uuid, disk)
> self.inst.disk_template = constants.DT_DRBD8
> self.rpc.call_blockdev_shutdown.return_value = \
> self.RpcResultsBuilder() \
> diff --git a/test/py/cmdlib/testsupport/config_mock.py
> b/test/py/cmdlib/testsupport/config_mock.py
> index b91b329..5c1f6e9 100644
> --- a/test/py/cmdlib/testsupport/config_mock.py
> +++ b/test/py/cmdlib/testsupport/config_mock.py
> @@ -258,11 +258,13 @@ class ConfigMock(config.ConfigWriter):
> osparams_private=osparams_private,
> admin_state=admin_state,
> nics=nics,
> - disks=disks,
> + disks=[],
> disk_template=disk_template,
> disks_active=disks_active,
> network_port=network_port)
> self.AddInstance(inst, None)
> + for disk in disks:
> + self.AddInstanceDisk(inst.uuid, disk)
> return inst
>
> def AddNewNetwork(self,
> @@ -552,7 +554,8 @@ class ConfigMock(config.ConfigWriter):
> nodegroups={},
> nodes={},
> instances={},
> - networks={})
> + networks={},
> + disks={})
>
> master_node_uuid = self._GetUuid()
>
> diff --git a/test/py/ganeti.config_unittest.py
> b/test/py/ganeti.config_unittest.py
> index 0c50cc4..b0ca943 100755
> --- a/test/py/ganeti.config_unittest.py
> +++ b/test/py/ganeti.config_unittest.py
> @@ -36,7 +36,6 @@ from ganeti import utils
> from ganeti import netutils
> from ganeti import compat
> from ganeti import serializer
> -from ganeti.cmdlib import instance
>
> from ganeti.config import TemporaryReservationManager
>
> @@ -157,12 +156,15 @@ class TestConfigRunner(unittest.TestCase):
> inst = self._create_instance(cfg)
> disks = [
> objects.Disk(dev_type=constants.DT_PLAIN, size=128,
> - logical_id=("myxenvg", "disk25494")),
> + logical_id=("myxenvg", "disk25494"),
> + uuid="disk0"),
> objects.Disk(dev_type=constants.DT_PLAIN, size=512,
> - logical_id=("myxenvg", "disk29071")),
> + logical_id=("myxenvg", "disk29071"),
> + uuid="disk1"),
> ]
> - inst.disks = disks
> cfg.AddInstance(inst, "my-job")
> + for disk in disks:
> + cfg.AddInstanceDisk(inst.uuid, disk)
>
> # Plain disks
> all_nodes = cfg.GetInstanceNodes(inst.uuid)
> @@ -191,14 +193,17 @@ class TestConfigRunner(unittest.TestCase):
> 12300, 0, 0, "secret"),
> children=[
> objects.Disk(dev_type=constants.DT_PLAIN, size=786432,
> - logical_id=("myxenvg", "disk0")),
> + logical_id=("myxenvg", "disk0"),
> + uuid="data0"),
> objects.Disk(dev_type=constants.DT_PLAIN, size=128,
> - logical_id=("myxenvg", "meta0"))
> + logical_id=("myxenvg", "meta0"),
> + uuid="meta0")
> ],
> - iv_name="disk/0")
> + iv_name="disk/0", uuid="disk0")
> ]
> - inst.disks = disks
> cfg.AddInstance(inst, "my-job")
> + for disk in disks:
> + cfg.AddInstanceDisk(inst.uuid, disk)
>
> # Drbd Disks
> all_nodes = cfg.GetInstanceNodes(inst.uuid)
> @@ -614,7 +619,7 @@ class TestCheckInstanceDiskIvNames(unittest.TestCase):
> def testNoError(self):
> disks = self._MakeDisks(["disk/0", "disk/1"])
> self.assertEqual(config._CheckInstanceDiskIvNames(disks), [])
> - instance._UpdateIvNames(0, disks)
> + config._UpdateIvNames(0, disks)
> self.assertEqual(config._CheckInstanceDiskIvNames(disks), [])
>
> def testWrongNames(self):
> @@ -625,7 +630,7 @@ class TestCheckInstanceDiskIvNames(unittest.TestCase):
> ])
>
> # Fix names
> - instance._UpdateIvNames(0, disks)
> + config._UpdateIvNames(0, disks)
> self.assertEqual(config._CheckInstanceDiskIvNames(disks), [])
>
>
> diff --git a/test/py/ganeti.rpc_unittest.py b/test/py/ganeti.rpc_unittest.py
> index 82cf05c..0bf0412 100755
> --- a/test/py/ganeti.rpc_unittest.py
> +++ b/test/py/ganeti.rpc_unittest.py
> @@ -716,6 +716,16 @@ class _FakeConfigForRpcRunner:
>
> def __init__(self, cluster=NotImplemented):
> self._cluster = cluster
> + self._disks = [
> + objects.Disk(dev_type=constants.DT_PLAIN, size=4096,
> + logical_id=("vg", "disk6120"),
> + uuid="disk_uuid_1"),
> + objects.Disk(dev_type=constants.DT_PLAIN, size=1024,
> + logical_id=("vg", "disk8508"),
> + uuid="disk_uuid_2"),
> + ]
> + for disk in self._disks:
> + disk.UpgradeConfig()
>
> def GetNodeInfo(self, name):
> return objects.Node(name=name)
> @@ -732,6 +742,9 @@ class _FakeConfigForRpcRunner:
> def GetInstanceSecondaryNodes(self, _):
> return []
>
> + def GetInstanceDisks(self, _):
> + return self._disks
> +
>
> class TestRpcRunner(unittest.TestCase):
> def testUploadFile(self):
> @@ -813,12 +826,8 @@ class TestRpcRunner(unittest.TestCase):
> }),
> ],
> disk_template=constants.DT_PLAIN,
> - disks=[
> - objects.Disk(dev_type=constants.DT_PLAIN, size=4096,
> - logical_id=("vg", "disk6120")),
> - objects.Disk(dev_type=constants.DT_PLAIN, size=1024,
> - logical_id=("vg", "disk8508")),
> - ])
> + disks=["disk_uuid_1", "disk_uuid_2"]
> + )
> inst.UpgradeConfig()
>
> cfg = _FakeConfigForRpcRunner(cluster=cluster)
> @@ -898,6 +907,7 @@ class TestRpcRunner(unittest.TestCase):
> "logical_id": ("vg", "disk6120"),
> "params": constants.DISK_DT_DEFAULTS[inst.disk_template],
> "serial_no": 1,
> + "uuid": "disk_uuid_1",
> }, {
> "dev_type": constants.DT_PLAIN,
> "dynamic_params": {},
> @@ -905,9 +915,11 @@ class TestRpcRunner(unittest.TestCase):
> "logical_id": ("vg", "disk8508"),
> "params": constants.DISK_DT_DEFAULTS[inst.disk_template],
> "serial_no": 1,
> + "uuid": "disk_uuid_2",
> }])
>
> - self.assertTrue(compat.all(disk.params == {} for disk in inst.disks),
> + inst_disks = cfg.GetInstanceDisks(inst.uuid)
> + self.assertTrue(compat.all(disk.params == {} for disk in inst_disks),
> msg="Configuration objects were modified")
>
>
> --
> 1.9.1
>
--
Jose Antonio Lopes
Ganeti Engineering
Google Germany GmbH
Dienerstr. 12, 80331, München
Registergericht und -nummer: Hamburg, HRB 86891
Sitz der Gesellschaft: Hamburg
Geschäftsführer: Graham Law, Christine Elizabeth Flores
Steuernummer: 48/725/00206
Umsatzsteueridentifikationsnummer: DE813741370