def test(self):
        device = objects.NIC()
        target = constants.HOTPLUG_TARGET_NIC
        fn = hv_kvm._GenerateDeviceKVMId
        self.assertRaises(errors.HotplugError, fn, target, device)

        device.pci = 5
        device.uuid = "003fc157-66a8-4e6d-8b7e-ec4f69751396"
        self.assertTrue(re.match("hotnic-003fc157-pci-5", fn(target, device)))
    def testNIC(self):
        device = objects.NIC()
        target = constants.HOTPLUG_TARGET_NIC
        runtime = self._GetRuntime()

        self._fail(target, device, runtime)

        device.uuid = "003fc157-66a8-4e6d-8b7e-ec4f69751396"
        devinfo = hv_kvm._GetExistingDeviceInfo(target, device, runtime)
        self.assertTrue(devinfo.pci == 6)
Exemplo n.º 3
0
    def CreateNic(self,
                  uuid=None,
                  name=None,
                  mac=None,
                  ip=None,
                  network=None,
                  nicparams=None,
                  netinfo=None):
        """Create a new L{objecs.NIC} object

    @rtype: L{objects.NIC}
    @return: the newly create NIC object

    """
        nic_id = self._cur_nic_id
        self._cur_nic_id += 1

        if uuid is None:
            uuid = self._GetUuid()
        if name is None:
            name = "mock_nic_%d" % nic_id
        if mac is None:
            mac = "aa:00:00:aa:%02x:%02x" % (nic_id / 0xff, nic_id % 0xff)
        if isinstance(network, objects.Network):
            if ip:
                pool = AddressPool(network)
                pool.Reserve(ip)
            network = network.uuid
        if nicparams is None:
            nicparams = {}

        return objects.NIC(uuid=uuid,
                           name=name,
                           mac=mac,
                           ip=ip,
                           network=network,
                           nicparams=nicparams,
                           netinfo=netinfo)
Exemplo n.º 4
0
 def test(self):
     device = objects.NIC()
     target = constants.HOTPLUG_TARGET_NIC
     fn = hv_kvm._GenerateDeviceKVMId
     device.uuid = "003fc157-66a8-4e6d-8b7e-ec4f69751396"
     self.assertTrue(re.match("nic-003fc157-66a8-4e6d", fn(target, device)))
Exemplo n.º 5
0
    def testEncodeInstance(self):
        cluster = objects.Cluster(hvparams={
            constants.HT_KVM: {
                constants.HV_CDROM_IMAGE_PATH: "foo",
            },
        },
                                  beparams={
                                      constants.PP_DEFAULT: {
                                          constants.BE_MAXMEM: 8192,
                                      },
                                  },
                                  os_hvp={},
                                  osparams={
                                      "linux": {
                                          "role": "unknown",
                                      },
                                  })
        cluster.UpgradeConfig()

        inst = objects.Instance(name="inst1.example.com",
                                hypervisor=constants.HT_KVM,
                                os="linux",
                                hvparams={
                                    constants.HV_CDROM_IMAGE_PATH: "bar",
                                    constants.HV_ROOT_PATH: "/tmp",
                                },
                                beparams={
                                    constants.BE_MINMEM: 128,
                                    constants.BE_MAXMEM: 256,
                                },
                                nics=[
                                    objects.NIC(nicparams={
                                        constants.NIC_MODE: "mymode",
                                    }),
                                ],
                                disk_template=constants.DT_PLAIN,
                                disks=["disk_uuid_1", "disk_uuid_2"])
        inst.UpgradeConfig()

        cfg = _FakeConfigForRpcRunner(cluster=cluster)
        runner = rpc.RpcRunner(cfg,
                               None,
                               _req_process_fn=NotImplemented,
                               _getents=mocks.FakeGetentResolver)

        def _CheckBasics(result):
            self.assertEqual(result["name"], "inst1.example.com")
            self.assertEqual(result["os"], "linux")
            self.assertEqual(result["beparams"][constants.BE_MINMEM], 128)
            self.assertEqual(len(result["nics"]), 1)
            self.assertEqual(
                result["nics"][0]["nicparams"][constants.NIC_MODE], "mymode")

        # Generic object serialization
        result = runner._encoder(NotImplemented,
                                 (rpc_defs.ED_OBJECT_DICT, inst))
        _CheckBasics(result)
        self.assertEqual(len(result["hvparams"]), 2)

        result = runner._encoder(NotImplemented,
                                 (rpc_defs.ED_OBJECT_DICT_LIST, 5 * [inst]))
        map(_CheckBasics, result)
        map(lambda r: self.assertEqual(len(r["hvparams"]), 2), result)

        # Just an instance
        result = runner._encoder(NotImplemented, (rpc_defs.ED_INST_DICT, inst))
        _CheckBasics(result)
        self.assertEqual(result["beparams"][constants.BE_MAXMEM], 256)
        self.assertEqual(result["hvparams"][constants.HV_CDROM_IMAGE_PATH],
                         "bar")
        self.assertEqual(result["hvparams"][constants.HV_ROOT_PATH], "/tmp")
        self.assertEqual(result["osparams"], {
            "role": "unknown",
        })
        self.assertEqual(len(result["hvparams"]),
                         len(constants.HVC_DEFAULTS[constants.HT_KVM]))

        # Instance with OS parameters
        result = runner._encoder(NotImplemented, (rpc_defs.ED_INST_DICT_OSP_DP,
                                                  (inst, {
                                                      "role": "webserver",
                                                      "other": "field",
                                                  })))
        _CheckBasics(result)
        self.assertEqual(result["beparams"][constants.BE_MAXMEM], 256)
        self.assertEqual(result["hvparams"][constants.HV_CDROM_IMAGE_PATH],
                         "bar")
        self.assertEqual(result["hvparams"][constants.HV_ROOT_PATH], "/tmp")
        self.assertEqual(result["osparams"], {
            "role": "webserver",
            "other": "field",
        })

        # Instance with hypervisor and backend parameters
        result = runner._encoder(NotImplemented,
                                 (rpc_defs.ED_INST_DICT_HVP_BEP_DP,
                                  (inst, {
                                      constants.HT_KVM: {
                                          constants.HV_BOOT_ORDER: "xyz",
                                      },
                                  }, {
                                      constants.BE_VCPUS: 100,
                                      constants.BE_MAXMEM: 4096,
                                  })))
        _CheckBasics(result)
        self.assertEqual(result["beparams"][constants.BE_MAXMEM], 4096)
        self.assertEqual(result["beparams"][constants.BE_VCPUS], 100)
        self.assertEqual(result["hvparams"][constants.HT_KVM], {
            constants.HV_BOOT_ORDER: "xyz",
        })
        del result["disks_info"][0]["ctime"]
        del result["disks_info"][0]["mtime"]
        del result["disks_info"][1]["ctime"]
        del result["disks_info"][1]["mtime"]
        self.assertEqual(
            result["disks_info"],
            [{
                "dev_type": constants.DT_PLAIN,
                "dynamic_params": {},
                "size": 4096,
                "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": {},
                "size": 1024,
                "logical_id": ("vg", "disk8508"),
                "params": constants.DISK_DT_DEFAULTS[inst.disk_template],
                "serial_no": 1,
                "uuid": "disk_uuid_2",
            }])

        inst_disks = cfg.GetInstanceDisks(inst.uuid)
        self.assertTrue(compat.all(disk.params == {} for disk in inst_disks),
                        msg="Configuration objects were modified")
Exemplo n.º 6
0
def ComputeNics(op, cluster, default_ip, cfg, ec_id):
    """Computes the nics.

  @param op: The instance opcode
  @param cluster: Cluster configuration object
  @param default_ip: The default ip to assign
  @param cfg: An instance of the configuration object
  @param ec_id: Execution context ID

  @returns: The build up nics

  """
    nics = []
    for nic in op.nics:
        nic_mode_req = nic.get(constants.INIC_MODE, None)
        nic_mode = nic_mode_req
        if nic_mode is None or nic_mode == constants.VALUE_AUTO:
            nic_mode = cluster.nicparams[constants.PP_DEFAULT][
                constants.NIC_MODE]

        net = nic.get(constants.INIC_NETWORK, None)
        link = nic.get(constants.NIC_LINK, None)
        ip = nic.get(constants.INIC_IP, None)
        vlan = nic.get(constants.INIC_VLAN, None)

        if net is None or net.lower() == constants.VALUE_NONE:
            net = None
        else:
            if nic_mode_req is not None or link is not None:
                raise errors.OpPrereqError(
                    "If network is given, no mode or link"
                    " is allowed to be passed", errors.ECODE_INVAL)

        # ip validity checks
        if ip is None or ip.lower() == constants.VALUE_NONE:
            nic_ip = None
        elif ip.lower() == constants.VALUE_AUTO:
            if not op.name_check:
                raise errors.OpPrereqError(
                    "IP address set to auto but name checks"
                    " have been skipped", errors.ECODE_INVAL)
            nic_ip = default_ip
        else:
            # We defer pool operations until later, so that the iallocator has
            # filled in the instance's node(s) dimara
            if ip.lower() == constants.NIC_IP_POOL:
                if net is None:
                    raise errors.OpPrereqError(
                        "if ip=pool, parameter network"
                        " must be passed too", errors.ECODE_INVAL)

            elif not netutils.IPAddress.IsValid(ip):
                raise errors.OpPrereqError("Invalid IP address '%s'" % ip,
                                           errors.ECODE_INVAL)

            nic_ip = ip

        # TODO: check the ip address for uniqueness
        if nic_mode == constants.NIC_MODE_ROUTED and not nic_ip and not net:
            raise errors.OpPrereqError(
                "Routed nic mode requires an ip address"
                " if not attached to a network", errors.ECODE_INVAL)

        # MAC address verification
        mac = nic.get(constants.INIC_MAC, constants.VALUE_AUTO)
        if mac not in (constants.VALUE_AUTO, constants.VALUE_GENERATE):
            mac = utils.NormalizeAndValidateMac(mac)

            try:
                # TODO: We need to factor this out
                cfg.ReserveMAC(mac, ec_id)
            except errors.ReservationError:
                raise errors.OpPrereqError(
                    "MAC address %s already in use"
                    " in cluster" % mac, errors.ECODE_NOTUNIQUE)

        #  Build nic parameters
        nicparams = {}
        if nic_mode_req:
            nicparams[constants.NIC_MODE] = nic_mode
        if link:
            nicparams[constants.NIC_LINK] = link
        if vlan:
            nicparams[constants.NIC_VLAN] = vlan

        check_params = cluster.SimpleFillNIC(nicparams)
        objects.NIC.CheckParameterSyntax(check_params)
        net_uuid = cfg.LookupNetwork(net)
        name = nic.get(constants.INIC_NAME, None)
        if name is not None and name.lower() == constants.VALUE_NONE:
            name = None
        nic_obj = objects.NIC(mac=mac,
                              ip=nic_ip,
                              name=name,
                              network=net_uuid,
                              nicparams=nicparams)
        nic_obj.uuid = cfg.GenerateUniqueID(ec_id)
        nics.append(nic_obj)

    return nics