1338 |
1338 |
@type vcpus: string
|
1339 |
1339 |
@param vcpus: the count of VCPUs the instance has
|
1340 |
1340 |
@type nics: list
|
1341 |
|
@param nics: list of tuples (ip, mac, mode, link) representing
|
|
1341 |
@param nics: list of tuples (ip, mac, mode, link, network) representing
|
1342 |
1342 |
the NICs the instance has
|
1343 |
1343 |
@type disk_template: string
|
1344 |
1344 |
@param disk_template: the disk template of the instance
|
... | ... | |
1373 |
1373 |
}
|
1374 |
1374 |
if nics:
|
1375 |
1375 |
nic_count = len(nics)
|
1376 |
|
for idx, (ip, mac, mode, link) in enumerate(nics):
|
|
1376 |
for idx, (ip, mac, mode, link, network) in enumerate(nics):
|
1377 |
1377 |
if ip is None:
|
1378 |
1378 |
ip = ""
|
1379 |
1379 |
env["INSTANCE_NIC%d_IP" % idx] = ip
|
1380 |
1380 |
env["INSTANCE_NIC%d_MAC" % idx] = mac
|
1381 |
1381 |
env["INSTANCE_NIC%d_MODE" % idx] = mode
|
1382 |
1382 |
env["INSTANCE_NIC%d_LINK" % idx] = link
|
|
1383 |
env["INSTANCE_NIC%d_NETWORK" % idx] = network
|
1383 |
1384 |
if mode == constants.NIC_MODE_BRIDGED:
|
1384 |
1385 |
env["INSTANCE_NIC%d_BRIDGE" % idx] = link
|
1385 |
1386 |
else:
|
... | ... | |
1429 |
1430 |
filled_params = cluster.SimpleFillNIC(nic.nicparams)
|
1430 |
1431 |
mode = filled_params[constants.NIC_MODE]
|
1431 |
1432 |
link = filled_params[constants.NIC_LINK]
|
1432 |
|
hooks_nics.append((ip, mac, mode, link))
|
|
1433 |
network = nic.network
|
|
1434 |
hooks_nics.append((ip, mac, mode, link, network))
|
1433 |
1435 |
return hooks_nics
|
1434 |
1436 |
|
1435 |
1437 |
|
... | ... | |
9423 |
9425 |
"""Run the allocator based on input opcode.
|
9424 |
9426 |
|
9425 |
9427 |
"""
|
|
9428 |
#TODO Export network to iallocator so that it chooses a pnode
|
|
9429 |
# in a nodegroup that has the desired network connected to
|
9426 |
9430 |
nics = [n.ToDict() for n in self.nics]
|
9427 |
9431 |
ial = IAllocator(self.cfg, self.rpc,
|
9428 |
9432 |
mode=constants.IALLOCATOR_MODE_ALLOC,
|
... | ... | |
9756 |
9760 |
if nic_mode is None or nic_mode == constants.VALUE_AUTO:
|
9757 |
9761 |
nic_mode = cluster.nicparams[constants.PP_DEFAULT][constants.NIC_MODE]
|
9758 |
9762 |
|
9759 |
|
# in routed mode, for the first nic, the default ip is 'auto'
|
9760 |
|
if nic_mode == constants.NIC_MODE_ROUTED and idx == 0:
|
9761 |
|
default_ip_mode = constants.VALUE_AUTO
|
|
9763 |
net = nic.get(constants.INIC_NETWORK, None)
|
|
9764 |
link = nic.get(constants.NIC_LINK, None)
|
|
9765 |
ip = nic.get(constants.INIC_IP, None)
|
|
9766 |
|
|
9767 |
if net is None or net.lower() == constants.VALUE_NONE:
|
|
9768 |
net = None
|
9762 |
9769 |
else:
|
9763 |
|
default_ip_mode = constants.VALUE_NONE
|
|
9770 |
if nic_mode_req is not None or link is not None:
|
|
9771 |
raise errors.OpPrereqError("If network is given, no mode or link"
|
|
9772 |
" is allowed to be passed",
|
|
9773 |
errors.ECODE_INVAL)
|
9764 |
9774 |
|
9765 |
9775 |
# ip validity checks
|
9766 |
|
ip = nic.get(constants.INIC_IP, default_ip_mode)
|
9767 |
9776 |
if ip is None or ip.lower() == constants.VALUE_NONE:
|
9768 |
9777 |
nic_ip = None
|
9769 |
9778 |
elif ip.lower() == constants.VALUE_AUTO:
|
... | ... | |
9773 |
9782 |
errors.ECODE_INVAL)
|
9774 |
9783 |
nic_ip = self.hostname1.ip
|
9775 |
9784 |
else:
|
9776 |
|
if not netutils.IPAddress.IsValid(ip):
|
|
9785 |
# We defer pool operations until later, so that the iallocator has
|
|
9786 |
# filled in the instance's node(s) dimara
|
|
9787 |
if ip.lower() == constants.NIC_IP_POOL:
|
|
9788 |
if net is None:
|
|
9789 |
raise errors.OpPrereqError("if ip=pool, parameter network"
|
|
9790 |
" must be passed too",
|
|
9791 |
errors.ECODE_INVAL)
|
|
9792 |
|
|
9793 |
elif not netutils.IPAddress.IsValid(ip):
|
9777 |
9794 |
raise errors.OpPrereqError("Invalid IP address '%s'" % ip,
|
9778 |
9795 |
errors.ECODE_INVAL)
|
|
9796 |
|
9779 |
9797 |
nic_ip = ip
|
9780 |
9798 |
|
9781 |
9799 |
# TODO: check the ip address for uniqueness
|
... | ... | |
9796 |
9814 |
errors.ECODE_NOTUNIQUE)
|
9797 |
9815 |
|
9798 |
9816 |
# Build nic parameters
|
9799 |
|
link = nic.get(constants.INIC_LINK, None)
|
9800 |
|
if link == constants.VALUE_AUTO:
|
9801 |
|
link = cluster.nicparams[constants.PP_DEFAULT][constants.NIC_LINK]
|
9802 |
9817 |
nicparams = {}
|
9803 |
9818 |
if nic_mode_req:
|
9804 |
9819 |
nicparams[constants.NIC_MODE] = nic_mode
|
... | ... | |
9807 |
9822 |
|
9808 |
9823 |
check_params = cluster.SimpleFillNIC(nicparams)
|
9809 |
9824 |
objects.NIC.CheckParameterSyntax(check_params)
|
9810 |
|
self.nics.append(objects.NIC(mac=mac, ip=nic_ip, nicparams=nicparams))
|
|
9825 |
self.nics.append(objects.NIC(mac=mac, ip=nic_ip,
|
|
9826 |
network=net, nicparams=check_params))
|
9811 |
9827 |
|
9812 |
9828 |
# disk checks/pre-build
|
9813 |
9829 |
default_vg = self.cfg.GetVGName()
|
... | ... | |
9910 |
9926 |
|
9911 |
9927 |
self.secondaries = []
|
9912 |
9928 |
|
|
9929 |
# Fill in any IPs from IP pools. This must happen here, because we need to
|
|
9930 |
# know the nic's primary node, as specified by the iallocator
|
|
9931 |
for idx, nic in enumerate(self.nics):
|
|
9932 |
net = nic.network
|
|
9933 |
if net is not None:
|
|
9934 |
netparams = self.cfg.GetGroupNetParams(net, self.pnode.name)
|
|
9935 |
if netparams is None:
|
|
9936 |
raise errors.OpPrereqError("No netparams found for network"
|
|
9937 |
" %s. Propably not connected to"
|
|
9938 |
" node's %s nodegroup" %
|
|
9939 |
(net, self.pnode.name),
|
|
9940 |
errors.ECODE_INVAL)
|
|
9941 |
self.LogInfo("NIC/%d inherits netparams %s" %
|
|
9942 |
(idx, netparams.values()))
|
|
9943 |
nic.nicparams = dict(netparams)
|
|
9944 |
if nic.ip is not None:
|
|
9945 |
filled_params = cluster.SimpleFillNIC(nic.nicparams)
|
|
9946 |
if nic.ip.lower() == constants.NIC_IP_POOL:
|
|
9947 |
try:
|
|
9948 |
nic.ip = self.cfg.GenerateIp(net, self.proc.GetECId())
|
|
9949 |
except errors.ReservationError:
|
|
9950 |
raise errors.OpPrereqError("Unable to get a free IP for NIC %d"
|
|
9951 |
" from the address pool" % idx,
|
|
9952 |
errors.ECODE_STATE)
|
|
9953 |
self.LogInfo("Chose IP %s from network %s", nic.ip, net)
|
|
9954 |
else:
|
|
9955 |
try:
|
|
9956 |
self.cfg.ReserveIp(net, nic.ip, self.proc.GetECId())
|
|
9957 |
except errors.ReservationError:
|
|
9958 |
raise errors.OpPrereqError("IP address %s already in use"
|
|
9959 |
" or does not belong to network %s" %
|
|
9960 |
(nic.ip, net),
|
|
9961 |
errors.ECODE_NOTUNIQUE)
|
|
9962 |
else:
|
|
9963 |
# net is None, ip None or given
|
|
9964 |
if self.op.conflicts_check:
|
|
9965 |
_CheckForConflictingIp(self, nic.ip, self.pnode.name)
|
|
9966 |
|
|
9967 |
|
9913 |
9968 |
# mirror node verification
|
9914 |
9969 |
if self.op.disk_template in constants.DTS_INT_MIRROR:
|
9915 |
9970 |
if self.op.snode == pnode.name:
|
... | ... | |
14945 |
15000 |
"ip": nic.ip,
|
14946 |
15001 |
"mode": filled_params[constants.NIC_MODE],
|
14947 |
15002 |
"link": filled_params[constants.NIC_LINK],
|
|
15003 |
"network": nic.network,
|
14948 |
15004 |
}
|
14949 |
15005 |
if filled_params[constants.NIC_MODE] == constants.NIC_MODE_BRIDGED:
|
14950 |
15006 |
nic_dict["bridge"] = filled_params[constants.NIC_LINK]
|
... | ... | |
15982 |
16038 |
except KeyError:
|
15983 |
16039 |
raise errors.OpPrereqError("Unknown query resource '%s'" % name,
|
15984 |
16040 |
errors.ECODE_INVAL)
|
|
16041 |
|
|
16042 |
def _CheckForConflictingIp(lu, ip, node):
|
|
16043 |
"""In case of conflicting ip raise error.
|
|
16044 |
|
|
16045 |
@type ip: string
|
|
16046 |
@param ip: ip address
|
|
16047 |
@type node: string
|
|
16048 |
@param node: node name
|
|
16049 |
|
|
16050 |
"""
|
|
16051 |
(conf_net, conf_netparams) = lu.cfg.CheckIPInNodeGroup(ip, node)
|
|
16052 |
if conf_net is not None:
|
|
16053 |
raise errors.OpPrereqError("Conflicting IP found:"
|
|
16054 |
" %s <> %s." % (ip, conf_net),
|
|
16055 |
errors.ECODE_INVAL)
|
|
16056 |
|
|
16057 |
return (None, None)
|