Exemplo n.º 1
0
    def test_convert_from_vmdk(self):
        """Test conversion of a RAW image from a VMDK."""
        old = DiskRepresentation.from_file(self.blank_vmdk)
        raw = RAW.from_other_image(old, self.temp_dir)

        self.assertEqual(raw.disk_format, 'raw')
        self.assertEqual(raw.disk_subformat, None)
Exemplo n.º 2
0
    def test_convert_from_vmdk(self):
        """Test conversion of a RAW image from a VMDK."""
        old = DiskRepresentation.from_file(self.blank_vmdk)
        raw = RAW.from_other_image(old, self.temp_dir)

        self.assertEqual(raw.disk_format, 'raw')
        self.assertEqual(raw.disk_subformat, None)
Exemplo n.º 3
0
    def test_inject_config_iso(self):
        """Inject config file on an ISO."""
        self.command.package = self.input_ovf
        self.command.config_file = self.config_file
        self.command.run()
        self.assertLogged(**self.OVERWRITING_DISK_ITEM)
        self.command.finished()
        config_iso = os.path.join(self.temp_dir, 'config.iso')
        self.check_diff("""
     <ovf:File ovf:href="sample_cfg.txt" ovf:id="textfile" \
ovf:size="{cfg_size}" />
+    <ovf:File ovf:href="config.iso" ovf:id="config.iso" \
ovf:size="{config_size}" />
   </ovf:References>
...
         <rasd:AutomaticAllocation>false</rasd:AutomaticAllocation>
+        <rasd:Description>Configuration disk</rasd:Description>
         <rasd:ElementName>CD-ROM 2</rasd:ElementName>
+        <rasd:HostResource>ovf:/file/config.iso</rasd:HostResource>
         <rasd:InstanceID>8</rasd:InstanceID>"""
                        .format(cfg_size=self.FILE_SIZE['sample_cfg.txt'],
                                config_size=os.path.getsize(config_iso)))
        if helpers['isoinfo']:
            # The sample_cfg.text should be renamed to the platform-specific
            # file name for bootstrap config - in this case, config.txt
            self.assertEqual(DiskRepresentation.from_file(config_iso).files,
                             ["config.txt"])
        else:
            logger.info("isoinfo not available, not checking disk contents")
Exemplo n.º 4
0
    def test_inject_extra_directory(self):
        """Test injection of extras from an entire directory."""
        self.command.package = self.input_ovf
        extra_dir = os.path.join(self.temp_dir, "configs")
        os.makedirs(extra_dir)

        shutil.copy(self.input_ovf, extra_dir)
        shutil.copy(self.minimal_ovf, extra_dir)
        subdir = os.path.join(extra_dir, "subdirectory")
        os.makedirs(subdir)
        shutil.copy(self.invalid_ovf, subdir)

        self.command.extra_files = [extra_dir]
        self.command.run()
        self.assertLogged(**self.OVERWRITING_DISK_ITEM)
        self.command.finished()

        config_iso = os.path.join(self.temp_dir, 'config.iso')
        if helpers['isoinfo']:
            self.assertEqual(
                DiskRepresentation.from_file(config_iso).files, [
                    'input.ovf',
                    'minimal.ovf',
                    'subdirectory',
                    'subdirectory/invalid.ovf',
                ])
        else:
            logger.info("isoinfo not present, not checking disk contents")
Exemplo n.º 5
0
    def test_inject_extra_directory(self):
        """Test injection of extras from an entire directory."""
        self.command.package = self.input_ovf
        extra_dir = os.path.join(self.temp_dir, "configs")
        os.makedirs(extra_dir)

        shutil.copy(self.input_ovf, extra_dir)
        shutil.copy(self.minimal_ovf, extra_dir)
        subdir = os.path.join(extra_dir, "subdirectory")
        os.makedirs(subdir)
        shutil.copy(self.invalid_ovf, subdir)

        self.command.extra_files = [extra_dir]
        self.command.run()
        self.assertLogged(**self.OVERWRITING_DISK_ITEM)
        self.command.finished()

        config_iso = os.path.join(self.temp_dir, 'config.iso')
        if helpers['isoinfo']:
            self.assertEqual(
                DiskRepresentation.from_file(config_iso).files,
                [
                    'input.ovf',
                    'minimal.ovf',
                    'subdirectory',
                    'subdirectory/invalid.ovf',
                ]
            )
        else:
            logger.info("isoinfo not present, not checking disk contents")
Exemplo n.º 6
0
    def test_inject_config_iso(self):
        """Inject config file on an ISO."""
        self.command.package = self.input_ovf
        self.command.config_file = self.config_file
        self.command.run()
        self.assertLogged(**self.OVERWRITING_DISK_ITEM)
        self.command.finished()
        config_iso = os.path.join(self.temp_dir, 'config.iso')
        self.check_diff("""
     <ovf:File ovf:href="sample_cfg.txt" ovf:id="textfile" \
ovf:size="{cfg_size}" />
+    <ovf:File ovf:href="config.iso" ovf:id="config.iso" \
ovf:size="{config_size}" />
   </ovf:References>
...
         <rasd:AutomaticAllocation>false</rasd:AutomaticAllocation>
+        <rasd:Description>Configuration disk</rasd:Description>
         <rasd:ElementName>CD-ROM 2</rasd:ElementName>
+        <rasd:HostResource>ovf:/file/config.iso</rasd:HostResource>
         <rasd:InstanceID>8</rasd:InstanceID>""".format(
            cfg_size=self.FILE_SIZE['sample_cfg.txt'],
            config_size=os.path.getsize(config_iso)))
        if helpers['isoinfo']:
            # The sample_cfg.text should be renamed to the platform-specific
            # file name for bootstrap config - in this case, config.txt
            self.assertEqual(
                DiskRepresentation.from_file(config_iso).files, ["config.txt"])
        else:
            logger.info("isoinfo not available, not checking disk contents")
Exemplo n.º 7
0
 def test_disk_representation_from_file_qcow2(self):
     """Test if DiskRepresentation.from_file() works for qcow2 images."""
     temp_disk = os.path.join(self.temp_dir, 'foo.qcow2')
     helpers['qemu-img'].call(['create', '-f', 'qcow2', temp_disk, "16M"])
     diskrep = DiskRepresentation.from_file(temp_disk)
     self.assertEqual(diskrep.disk_format, "qcow2")
     self.assertEqual(diskrep.disk_subformat, None)
Exemplo n.º 8
0
 def test_disk_representation_from_file_qcow2(self):
     """Test if DiskRepresentation.from_file() works for qcow2 images."""
     temp_disk = os.path.join(self.temp_dir, 'foo.qcow2')
     helpers['qemu-img'].call(['create', '-f', 'qcow2', temp_disk, "16M"])
     diskrep = DiskRepresentation.from_file(temp_disk)
     self.assertEqual(diskrep.disk_format, "qcow2")
     self.assertEqual(diskrep.disk_subformat, None)
Exemplo n.º 9
0
 def test_disk_representation_from_file_iso(self):
     """Test if DiskRepresentation.from_file() works for iso images."""
     diskrep = DiskRepresentation.from_file(self.input_iso)
     self.assertEqual(diskrep.disk_format, "iso")
     # In Travis CI we can't currently install isoinfo (via genisoimage).
     # https://github.com/travis-ci/apt-package-whitelist/issues/588
     if helpers['isoinfo']:
         self.assertEqual(diskrep.disk_subformat, "")
Exemplo n.º 10
0
 def test_disk_representation_from_file_iso(self):
     """Test if DiskRepresentation.from_file() works for iso images."""
     diskrep = DiskRepresentation.from_file(self.input_iso)
     self.assertEqual(diskrep.disk_format, "iso")
     # In Travis CI we can't currently install isoinfo (via genisoimage).
     # https://github.com/travis-ci/apt-package-whitelist/issues/588
     if helpers['isoinfo']:
         self.assertEqual(diskrep.disk_subformat, "")
Exemplo n.º 11
0
 def test_disk_representation_from_file_raw_noext(self):
     """DiskRepresentation.from_file() falls back to RAW if unsure."""
     temp_disk = os.path.join(self.temp_dir, 'foo.bar')
     with open(temp_disk, 'a') as fakedisk:
         fakedisk.write("Hello world")
     diskrep = DiskRepresentation.from_file(temp_disk)
     self.assertEqual(diskrep.disk_format, "raw")
     self.assertEqual(diskrep.disk_subformat, None)
     # Less confidence in this case
     self.assertLogged(levelname='WARNING',
                       msg='COT has low confidence',
                       args=(temp_disk, 'raw', '10'))
Exemplo n.º 12
0
 def test_disk_representation_from_file_raw_noext(self):
     """DiskRepresentation.from_file() falls back to RAW if unsure."""
     temp_disk = os.path.join(self.temp_dir, 'foo.bar')
     with open(temp_disk, 'a') as fakedisk:
         fakedisk.write("Hello world")
     diskrep = DiskRepresentation.from_file(temp_disk)
     self.assertEqual(diskrep.disk_format, "raw")
     self.assertEqual(diskrep.disk_subformat, None)
     # Less confidence in this case
     self.assertLogged(levelname='WARNING',
                       msg='COT has low confidence',
                       args=(temp_disk, 'raw', '10'))
Exemplo n.º 13
0
 def setUp(self):
     """Pre-test setup."""
     super(TestVMDKConversion, self).setUp()
     self.input_image_paths = {}
     self.input_disks = {}
     input_dir = os.path.join(self.temp_dir, "disks")
     os.makedirs(input_dir)
     for disk_format in ["raw", "qcow2", "vmdk"]:
         temp_disk = os.path.join(input_dir, "foo.{0}".format(disk_format))
         helpers['qemu-img'].call(
             ['create', '-f', disk_format, temp_disk, "16M"])
         self.input_disks[disk_format] = DiskRepresentation.from_file(
             temp_disk)
Exemplo n.º 14
0
 def setUp(self):
     """Pre-test setup."""
     super(TestVMDKConversion, self).setUp()
     self.input_image_paths = {}
     self.input_disks = {}
     input_dir = os.path.join(self.temp_dir, "disks")
     os.makedirs(input_dir)
     for disk_format in ["raw", "qcow2", "vmdk"]:
         temp_disk = os.path.join(input_dir,
                                  "foo.{0}".format(disk_format))
         helpers['qemu-img'].call(['create', '-f', disk_format,
                                   temp_disk, "16M"])
         self.input_disks[disk_format] = DiskRepresentation.from_file(
             temp_disk)
Exemplo n.º 15
0
    def test_inject_config_primary_secondary_extra(self):
        """Test injection of primary and secondary files and extras."""
        self.command.package = self.input_ovf
        # IOSXRv supports secondary config
        self.set_vm_platform(IOSXRv)
        self.command.config_file = self.config_file
        self.command.secondary_config_file = self.config_file
        self.command.extra_files = [self.minimal_ovf, self.vmware_ovf]
        self.command.run()
        self.assertLogged(**self.OVERWRITING_DISK_ITEM)
        self.command.finished()
        self.assertLogged(**self.invalid_hardware_warning(
            '4CPU-4GB-3NIC', 'VMXNET3', 'NIC type'))
        self.assertLogged(**self.invalid_hardware_warning(
            '1CPU-1GB-1NIC', 'VMXNET3', 'NIC type'))
        self.assertLogged(**self.invalid_hardware_warning(
            '1CPU-1GB-1NIC', '1024', 'MiB of RAM'))
        self.assertLogged(**self.invalid_hardware_warning(
            '2CPU-2GB-1NIC', 'VMXNET3', 'NIC type'))
        self.assertLogged(**self.invalid_hardware_warning(
            '2CPU-2GB-1NIC', '2048', 'MiB of RAM'))
        config_iso = os.path.join(self.temp_dir, 'config.iso')
        self.check_diff("""
     <ovf:File ovf:href="sample_cfg.txt" ovf:id="textfile" \
ovf:size="{cfg_size}" />
+    <ovf:File ovf:href="config.iso" ovf:id="config.iso" \
ovf:size="{config_size}" />
   </ovf:References>
...
         <rasd:AutomaticAllocation>false</rasd:AutomaticAllocation>
+        <rasd:Description>Configuration disk</rasd:Description>
         <rasd:ElementName>CD-ROM 2</rasd:ElementName>
+        <rasd:HostResource>ovf:/file/config.iso</rasd:HostResource>
         <rasd:InstanceID>8</rasd:InstanceID>"""
                        .format(cfg_size=self.FILE_SIZE['sample_cfg.txt'],
                                config_size=os.path.getsize(config_iso)))
        if helpers['isoinfo']:
            self.assertEqual(
                DiskRepresentation.from_file(config_iso).files,
                [
                    "iosxr_config.txt",
                    "iosxr_config_admin.txt",
                    "minimal.ovf",
                    "vmware.ovf",
                ]
            )
        else:
            logger.info("isoinfo not available, not checking disk contents")
Exemplo n.º 16
0
    def test_inject_config_iso_multiple_drives(self):
        """Inject config file on an ISO when multiple empty drives exist."""
        temp_ovf = os.path.join(self.temp_dir, "intermediate.ovf")

        # Remove the existing ISO from our input_ovf:
        remover = COTRemoveFile(UI())
        remover.package = self.input_ovf
        remover.output = temp_ovf
        remover.file_path = "input.iso"
        remover.run()
        remover.finished()
        remover.destroy()

        # Now we have two empty drives.
        self.command.package = temp_ovf
        self.command.config_file = self.config_file
        self.command.run()
        self.assertLogged(**self.OVERWRITING_DISK_ITEM)
        self.command.finished()
        config_iso = os.path.join(self.temp_dir, 'config.iso')
        self.check_diff("""
     <ovf:File ovf:href="input.vmdk" ovf:id="file1" ovf:size="{vmdk_size}" />
-    <ovf:File ovf:href="input.iso" ovf:id="file2" ovf:size="{iso_size}" />
     <ovf:File ovf:href="sample_cfg.txt" ovf:id="textfile" \
ovf:size="{cfg_size}" />
+    <ovf:File ovf:href="config.iso" ovf:id="config.iso" \
ovf:size="{config_size}" />
   </ovf:References>
...
         <rasd:AutomaticAllocation>true</rasd:AutomaticAllocation>
+        <rasd:Description>Configuration disk</rasd:Description>
         <rasd:ElementName>CD-ROM 1</rasd:ElementName>
-        <rasd:HostResource>ovf:/file/file2</rasd:HostResource>
+        <rasd:HostResource>ovf:/file/config.iso</rasd:HostResource>
         <rasd:InstanceID>7</rasd:InstanceID>"""
                        .format(vmdk_size=self.FILE_SIZE['input.vmdk'],
                                iso_size=self.FILE_SIZE['input.iso'],
                                cfg_size=self.FILE_SIZE['sample_cfg.txt'],
                                config_size=os.path.getsize(config_iso)))
        if helpers['isoinfo']:
            # The sample_cfg.text should be renamed to the platform-specific
            # file name for bootstrap config - in this case, config.txt
            self.assertEqual(DiskRepresentation.from_file(config_iso).files,
                             ["config.txt"])
        else:
            logger.info("isoinfo not available, not checking disk contents")
Exemplo n.º 17
0
    def test_inject_config_iso_multiple_drives(self):
        """Inject config file on an ISO when multiple empty drives exist."""
        temp_ovf = os.path.join(self.temp_dir, "intermediate.ovf")

        # Remove the existing ISO from our input_ovf:
        remover = COTRemoveFile(UI())
        remover.package = self.input_ovf
        remover.output = temp_ovf
        remover.file_path = "input.iso"
        remover.run()
        remover.finished()
        remover.destroy()

        # Now we have two empty drives.
        self.command.package = temp_ovf
        self.command.config_file = self.config_file
        self.command.run()
        self.assertLogged(**self.OVERWRITING_DISK_ITEM)
        self.command.finished()
        config_iso = os.path.join(self.temp_dir, 'config.iso')
        self.check_diff("""
     <ovf:File ovf:href="input.vmdk" ovf:id="file1" ovf:size="{vmdk_size}" />
-    <ovf:File ovf:href="input.iso" ovf:id="file2" ovf:size="{iso_size}" />
     <ovf:File ovf:href="sample_cfg.txt" ovf:id="textfile" \
ovf:size="{cfg_size}" />
+    <ovf:File ovf:href="config.iso" ovf:id="config.iso" \
ovf:size="{config_size}" />
   </ovf:References>
...
         <rasd:AutomaticAllocation>true</rasd:AutomaticAllocation>
+        <rasd:Description>Configuration disk</rasd:Description>
         <rasd:ElementName>CD-ROM 1</rasd:ElementName>
-        <rasd:HostResource>ovf:/file/file2</rasd:HostResource>
+        <rasd:HostResource>ovf:/file/config.iso</rasd:HostResource>
         <rasd:InstanceID>7</rasd:InstanceID>""".format(
            vmdk_size=self.FILE_SIZE['input.vmdk'],
            iso_size=self.FILE_SIZE['input.iso'],
            cfg_size=self.FILE_SIZE['sample_cfg.txt'],
            config_size=os.path.getsize(config_iso)))
        if helpers['isoinfo']:
            # The sample_cfg.text should be renamed to the platform-specific
            # file name for bootstrap config - in this case, config.txt
            self.assertEqual(
                DiskRepresentation.from_file(config_iso).files, ["config.txt"])
        else:
            logger.info("isoinfo not available, not checking disk contents")
Exemplo n.º 18
0
    def test_inject_config_primary_secondary_extra(self):
        """Test injection of primary and secondary files and extras."""
        self.command.package = self.input_ovf
        # IOSXRv supports secondary config
        self.set_vm_platform(IOSXRv)
        self.command.config_file = self.config_file
        self.command.secondary_config_file = self.config_file
        self.command.extra_files = [self.minimal_ovf, self.vmware_ovf]
        self.command.run()
        self.assertLogged(**self.OVERWRITING_DISK_ITEM)
        self.command.finished()
        self.assertLogged(**self.invalid_hardware_warning(
            '4CPU-4GB-3NIC', 'VMXNET3', 'NIC type'))
        self.assertLogged(**self.invalid_hardware_warning(
            '1CPU-1GB-1NIC', 'VMXNET3', 'NIC type'))
        self.assertLogged(**self.invalid_hardware_warning(
            '1CPU-1GB-1NIC', '1024', 'MiB of RAM'))
        self.assertLogged(**self.invalid_hardware_warning(
            '2CPU-2GB-1NIC', 'VMXNET3', 'NIC type'))
        self.assertLogged(**self.invalid_hardware_warning(
            '2CPU-2GB-1NIC', '2048', 'MiB of RAM'))
        config_iso = os.path.join(self.temp_dir, 'config.iso')
        self.check_diff("""
     <ovf:File ovf:href="sample_cfg.txt" ovf:id="textfile" \
ovf:size="{cfg_size}" />
+    <ovf:File ovf:href="config.iso" ovf:id="config.iso" \
ovf:size="{config_size}" />
   </ovf:References>
...
         <rasd:AutomaticAllocation>false</rasd:AutomaticAllocation>
+        <rasd:Description>Configuration disk</rasd:Description>
         <rasd:ElementName>CD-ROM 2</rasd:ElementName>
+        <rasd:HostResource>ovf:/file/config.iso</rasd:HostResource>
         <rasd:InstanceID>8</rasd:InstanceID>""".format(
            cfg_size=self.FILE_SIZE['sample_cfg.txt'],
            config_size=os.path.getsize(config_iso)))
        if helpers['isoinfo']:
            self.assertEqual(
                DiskRepresentation.from_file(config_iso).files, [
                    "iosxr_config.txt",
                    "iosxr_config_admin.txt",
                    "minimal.ovf",
                    "vmware.ovf",
                ])
        else:
            logger.info("isoinfo not available, not checking disk contents")
Exemplo n.º 19
0
    def test_disk_conversion(self):
        """Make sure hard disk is converted to stream-optimized VMDK format."""
        # Create a qcow2 image and add it as a new disk
        new_qcow2 = os.path.join(self.temp_dir, "new.qcow2")
        # Make it a small file to keep the test fast
        QCOW2.create_file(path=new_qcow2, capacity="16M")
        self.command.package = self.input_ovf
        self.command.disk_image = new_qcow2
        self.command.controller = 'scsi'
        self.command.run()
        self.assertLogged(**self.DRIVE_TYPE_GUESSED_HARDDISK)
        self.command.finished()
        # Make sure the disk was converted and added to the OVF
        self.check_diff("""
     <ovf:File ovf:href="sample_cfg.txt" ovf:id="textfile" \
ovf:size="{cfg_size}" />
+    <ovf:File ovf:href="new.vmdk" ovf:id="new.vmdk" ovf:size="{new_size}" />
   </ovf:References>
...
     <ovf:Disk ovf:capacity="1" ovf:capacityAllocationUnits="byte * 2^30" \
ovf:diskId="vmdisk1" ovf:fileRef="file1" ovf:format=\
"http://www.vmware.com/interfaces/specifications/vmdk.html#streamOptimized" />
+    <ovf:Disk ovf:capacity="16" ovf:capacityAllocationUnits="byte * 2^20" \
ovf:diskId="new.vmdk" ovf:fileRef="new.vmdk" ovf:format=\
"http://www.vmware.com/interfaces/specifications/vmdk.html#streamOptimized" />
   </ovf:DiskSection>
...
       </ovf:Item>
+      <ovf:Item>
+        <rasd:AddressOnParent>1</rasd:AddressOnParent>
+        <rasd:ElementName>Hard Disk Drive</rasd:ElementName>
+        <rasd:HostResource>ovf:/disk/new.vmdk</rasd:HostResource>
+        <rasd:InstanceID>14</rasd:InstanceID>
+        <rasd:Parent>3</rasd:Parent>
+        <rasd:ResourceType>17</rasd:ResourceType>
+      </ovf:Item>
     </ovf:VirtualHardwareSection>
""".format(cfg_size=self.FILE_SIZE['sample_cfg.txt'],
           new_size=os.path.getsize(os.path.join(self.temp_dir, "new.vmdk"))))
        # Make sure the disk was actually converted to the right format
        diskrep = DiskRepresentation.from_file(os.path.join(self.temp_dir,
                                                            "new.vmdk"))
        self.assertEqual(diskrep.disk_format, 'vmdk')
        self.assertEqual(diskrep.disk_subformat, "streamOptimized")
Exemplo n.º 20
0
 def disk_image(self, value):
     self._disk_image = DiskRepresentation.from_file(value)
Exemplo n.º 21
0
 def test_disk_representation_from_file_vmdk(self):
     """Test if DiskRepresentation.from_file() works for vmdk images."""
     diskrep = DiskRepresentation.from_file(self.blank_vmdk)
     self.assertEqual(diskrep.disk_format, "vmdk")
     self.assertEqual(diskrep.disk_subformat, "streamOptimized")
Exemplo n.º 22
0
 def disk_image(self, value):
     self._disk_image = DiskRepresentation.from_file(value)
Exemplo n.º 23
0
 def test_convert_to_errors(self):
     """Invalid inputs to convert_to()."""
     self.assertRaises(
         NotImplementedError,
         DiskRepresentation.from_file(self.blank_vmdk).convert_to,
         "frobozz", self.temp_dir)
Exemplo n.º 24
0
 def test_disk_representation_from_file_vmdk(self):
     """Test if DiskRepresentation.from_file() works for vmdk images."""
     diskrep = DiskRepresentation.from_file(self.blank_vmdk)
     self.assertEqual(diskrep.disk_format, "vmdk")
     self.assertEqual(diskrep.disk_subformat, "streamOptimized")
Exemplo n.º 25
0
 def test_convert_to_errors(self):
     """Invalid inputs to convert_to()."""
     self.assertRaises(
         NotImplementedError,
         DiskRepresentation.from_file(self.blank_vmdk).convert_to,
         "frobozz", self.temp_dir)