2895 |
2895 |
CheckInstanceState(self, self.instance, CAN_CHANGE_INSTANCE_OFFLINE,
|
2896 |
2896 |
msg="can't change to offline")
|
2897 |
2897 |
|
|
2898 |
@staticmethod
|
|
2899 |
def _InstanceCommunicationDDM(cfg, instance_communication, instance):
|
|
2900 |
"""Create a NIC mod that adds or removes the instance
|
|
2901 |
communication NIC to a running instance.
|
|
2902 |
|
|
2903 |
The NICS are dynamically created using the Dynamic Device
|
|
2904 |
Modification (DDM). This function produces a NIC modification
|
|
2905 |
(mod) that inserts an additional NIC meant for instance
|
|
2906 |
communication in or removes an existing instance communication NIC
|
|
2907 |
from a running instance, using DDM.
|
|
2908 |
|
|
2909 |
@type cfg: L{config.ConfigWriter}
|
|
2910 |
@param cfg: cluster configuration
|
|
2911 |
|
|
2912 |
@type instance_communication: boolean
|
|
2913 |
@param instance_communication: whether instance communication is
|
|
2914 |
enabled or disabled
|
|
2915 |
|
|
2916 |
@type instance: L{objects.Instance}
|
|
2917 |
@param instance: instance to which the NIC mod will be applied to
|
|
2918 |
|
|
2919 |
@rtype: (L{constants.DDM_ADD}, -1, parameters) or
|
|
2920 |
(L{constants.DDM_REMOVE}, -1, parameters) or
|
|
2921 |
L{None}
|
|
2922 |
@return: DDM mod containing an action to add or remove the NIC, or
|
|
2923 |
None if nothing needs to be done
|
|
2924 |
|
|
2925 |
"""
|
|
2926 |
nic_name = "%s%s" % (constants.INSTANCE_COMMUNICATION_NIC_PREFIX,
|
|
2927 |
instance.name)
|
|
2928 |
|
|
2929 |
instance_communication_nic = None
|
|
2930 |
|
|
2931 |
for nic in instance.nics:
|
|
2932 |
if nic.name == nic_name:
|
|
2933 |
instance_communication_nic = nic
|
|
2934 |
break
|
|
2935 |
|
|
2936 |
if instance_communication and not instance_communication_nic:
|
|
2937 |
action = constants.DDM_ADD
|
|
2938 |
params = {constants.INIC_NAME: nic_name,
|
|
2939 |
constants.INIC_MAC: constants.VALUE_GENERATE,
|
|
2940 |
constants.INIC_IP: constants.NIC_IP_POOL,
|
|
2941 |
constants.INIC_NETWORK:
|
|
2942 |
cfg.GetInstanceCommunicationNetwork()}
|
|
2943 |
elif not instance_communication and instance_communication_nic:
|
|
2944 |
action = constants.DDM_REMOVE
|
|
2945 |
params = None
|
|
2946 |
else:
|
|
2947 |
action = None
|
|
2948 |
params = None
|
|
2949 |
|
|
2950 |
if action is not None:
|
|
2951 |
return (action, -1, params)
|
|
2952 |
else:
|
|
2953 |
return None
|
|
2954 |
|
2898 |
2955 |
def CheckPrereq(self):
|
2899 |
2956 |
"""Check prerequisites.
|
2900 |
2957 |
|
... | ... | |
2953 |
3010 |
self.op.hotplug = True
|
2954 |
3011 |
|
2955 |
3012 |
# Prepare NIC modifications
|
|
3013 |
# add or remove NIC for instance communication
|
|
3014 |
if self.op.instance_communication is not None:
|
|
3015 |
mod = self._InstanceCommunicationDDM(self.cfg,
|
|
3016 |
self.op.instance_communication,
|
|
3017 |
self.instance)
|
|
3018 |
if mod is not None:
|
|
3019 |
self.op.nics.append(mod)
|
|
3020 |
|
2956 |
3021 |
self.nicmod = _PrepareContainerMods(self.op.nics, _InstNicModPrivate)
|
2957 |
3022 |
|
2958 |
3023 |
# OS change
|