Chad Smith has proposed merging 
lp:~chad.smith/vmbuilder/jenkins_kvm_azure_netplan_hotplug into 
lp:~ubuntu-on-ec2/vmbuilder/jenkins_kvm.

Commit message:
Update Azure's nic hotplug script to use netplan if available instead of ENI
  
Also avoid appending unnecessary include directives in
/etc/network/interfaces on netplan-enabled systems.


Requested reviews:
  VMBuilder (vmbuilder)

For more details, see:
https://code.launchpad.net/~chad.smith/vmbuilder/jenkins_kvm_azure_netplan_hotplug/+merge/347212

WIP: I think I targeted the wrong branch, will resubmit tomorrow
diff should be http://paste.ubuntu.com/p/Kx8YrXv7cp/


Azure images deliver a script /usr/local/sbin/ephemeral_eth.sh which is called 
from udev add rules on nic hotplug events for nics named eth[1-9]*. This script 
was created when netplan wasn't a 'thing' and, as such, only cared about 
/etc/network/interfaces.

In Bionic and later, cloud-init writes a fallback interface config in 
/etc/netplan/50-cloud-init.yaml configuration dhcp on eth0 as a 
primary/mandatory NIC (optional: false). So boot will wait on that device to 
come up.

This changeset adds a test whether netplan command exists in ephemeral_eth.sh:
  - If netplan is present, a separate /etc/netplan/90-hotplug-<nicname>.yaml 
will be generated for each network device eth[1-9]n* that is attached after 
cloud-init's initial network configuration.
  - After the netplan yaml is created, call 'netplan apply' to bring up that 
device with dchp. The netplan config will specify that these nics are 
"optional: true" so that subsequent boots will not wait on them to come up in 
case they are subsequently detached.

Attaching nics in Azure is done through their UI or API. The 
attaching/detaching operation in Azure requires an instance to be stopped 
before attach/detach and started after the operation.

  Potental gap:
     There is no attempt to clean up old netplan yaml files, or to designate a 
new primary/mandatory nic because this original hotplug script didn't deal with 
udev rules for hotplug removal of nics (via Azure network interface detachment).
     This could present a minor issue if eth1 is attached (and optional by 
design) and eth0 gets detached. In that case, systemd may still wait for eth0 
to come up because of the mandatory eth0 definition in 
/etc/netplan/50-cloud-init.yaml.
-- 
Your team VMBuilder is requested to review the proposed merge of 
lp:~chad.smith/vmbuilder/jenkins_kvm_azure_netplan_hotplug into 
lp:~ubuntu-on-ec2/vmbuilder/jenkins_kvm.
=== modified file 'templates/img-extra-nets.tmpl'
--- templates/img-extra-nets.tmpl	2017-08-22 19:29:36 +0000
+++ templates/img-extra-nets.tmpl	2018-05-31 14:58:36 +0000
@@ -5,6 +5,7 @@
 # vi: ts=4 noexpandtab syntax=sh
 
 int_d="/run/network/interfaces.ephemeral.d"
+netp_d="/etc/netplan"
 
 function config_upstart {
     # Give an upstart job for defining a secondary interface
@@ -52,6 +53,29 @@
 
 INTERFACE=\$1
 net_int_d="${int_d}"
+netplan_d="${netp_d}"
+
+
+function configure_nic_netplan {
+    # Write separate netplan yaml for each hot-plugged interface
+    if [ -e \${netplan_d}/90-hotplug-\${INTERFACE}.yaml ]; then
+        return
+    fi
+    cat << EOM > \${netplan_d}/90-hotplug-\${INTERFACE}.yaml
+# Added by \$0 due to udev nic hotplug event
+network:
+    version: 2
+    ethernets:
+        \${INTERFACE}:
+            dhcp4: true
+            match:
+              driver: hv_netvsc
+              name: \${INTERFACE}
+            optional: true
+EOM
+    netplan apply
+}
+
 
 function configure_nic {
     # Ensure \${net_int_d} exists on the ephemeral mount
@@ -69,8 +93,11 @@
     eth0) #skip, this is static
         ;;
     eth*)
-        if [ ! -e \${net_int_d}/\${INTERFACE}.cfg ]
-        then
+        command -v netplan > /dev/null
+        if [ \$? -eq 0 ]; then
+            # netplan is present
+            configure_nic_netplan
+        elif [ ! -e \${net_int_d}/\${INTERFACE}.cfg ]; then
             configure_nic
         fi
         ;;
@@ -97,8 +124,9 @@
         ;;
 esac
 
-# Add the network ephemeral mount...
-cat << EOF >> ${mp}/etc/network/interfaces
+# Add the network ephemeral mount... only on non-netplan images
+if [ -e ${mp}/usr/sbin/netplan ]; then
+    cat << EOF >> ${mp}/etc/network/interfaces
 
 # Read the dynamically created configurations from tmpfs mount. If you want a static
 # configuration, disable the line below. However, you will have to manually configure
@@ -107,6 +135,7 @@
 source ${int_d}/*.cfg
 
 EOF
+fi
 
 # END NICS
 ##################

_______________________________________________
Mailing list: https://launchpad.net/~vmbuilder
Post to     : [email protected]
Unsubscribe : https://launchpad.net/~vmbuilder
More help   : https://help.launchpad.net/ListHelp

Reply via email to