Merge "Add element to process config-drive network info"
This commit is contained in:
		
							
								
								
									
										35
									
								
								elements/simple-init/README.rst
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										35
									
								
								elements/simple-init/README.rst
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,35 @@ | |||||||
|  | =========== | ||||||
|  | simple-init | ||||||
|  | =========== | ||||||
|  | Basic network and system configuration that can't be done until boot | ||||||
|  |  | ||||||
|  | Unfortunately, as much as we'd like to bake it in to an image, we can't | ||||||
|  | know in advance how many network devices will be present, nor if DHCP is | ||||||
|  | present in the host cloud. Additionally, in environments where cloud-init | ||||||
|  | is not used, there are a couple of small things, like mounting config-drive | ||||||
|  | and pulling ssh keys from it, that need to be done at boot time. | ||||||
|  |  | ||||||
|  | Autodetect network interfaces during boot and configure them | ||||||
|  | ------------------------------------------------------------ | ||||||
|  |  | ||||||
|  | The rationale for this is that we are likely to require multiple | ||||||
|  | network interfaces for use cases such as baremetal and there is no way | ||||||
|  | to know ahead of time which one is which, so we will simply run a | ||||||
|  | DHCP client on all interfaces with real MAC addresses (except lo) that | ||||||
|  | are visible on the first boot. | ||||||
|  |  | ||||||
|  | The script `/usr/local/sbin/simple-init.sh` will be called | ||||||
|  | early in each boot and will scan available network interfaces and | ||||||
|  | ensure they are configured properly before networking services are started. | ||||||
|  |  | ||||||
|  | Processing startup information from config-drive | ||||||
|  | ------------------------------------------------ | ||||||
|  |  | ||||||
|  | On most systems, the DHCP approach desribed above is fine. But in some clouds, | ||||||
|  | such as Rackspace Public cloud, there is no DHCP.  Instead, there is static | ||||||
|  | network config via `config-drive`. `simple-init` will happily call | ||||||
|  | `glean` which will do nothing if static network information is | ||||||
|  | not there. | ||||||
|  |  | ||||||
|  | Finally, glean will handle ssh-keypair-injection from config | ||||||
|  | drive if cloud-init is not installed. | ||||||
							
								
								
									
										3
									
								
								elements/simple-init/element-deps
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										3
									
								
								elements/simple-init/element-deps
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,3 @@ | |||||||
|  | dib-init-system | ||||||
|  | install-types | ||||||
|  | source-repositories | ||||||
							
								
								
									
										34
									
								
								elements/simple-init/install.d/50-simple-init
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										34
									
								
								elements/simple-init/install.d/50-simple-init
									
									
									
									
									
										Executable file
									
								
							| @@ -0,0 +1,34 @@ | |||||||
|  | #!/bin/bash | ||||||
|  | # Licensed under the Apache License, Version 2.0 (the "License"); | ||||||
|  | # you may not use this file except in compliance with the License. | ||||||
|  | # You may obtain a copy of the License at | ||||||
|  | # | ||||||
|  | #    http://www.apache.org/licenses/LICENSE-2.0 | ||||||
|  | # | ||||||
|  | # Unless required by applicable law or agreed to in writing, software | ||||||
|  | # distributed under the License is distributed on an "AS IS" BASIS, | ||||||
|  | # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or | ||||||
|  | # implied. | ||||||
|  | # | ||||||
|  | # See the License for the specific language governing permissions and | ||||||
|  | # limitations under the License. | ||||||
|  |  | ||||||
|  | if [ ${DIB_DEBUG_TRACE:-1} -gt 0 ]; then | ||||||
|  |     set -x | ||||||
|  | fi | ||||||
|  | set -eu | ||||||
|  | set -o pipefail | ||||||
|  |  | ||||||
|  | SCRIPTDIR=$(dirname $0) | ||||||
|  |  | ||||||
|  | install -D -g root -o root -m 0755 ${SCRIPTDIR}/simple-init.sh /usr/local/sbin/simple-init.sh | ||||||
|  |  | ||||||
|  | if [ "$DIB_INIT_SYSTEM" == "upstart" ]; then | ||||||
|  |     install -D -g root -o root -m 0755 ${SCRIPTDIR}/simple-init.conf /etc/init/simple-init.conf | ||||||
|  | elif [ "$DIB_INIT_SYSTEM" == "systemd" ]; then | ||||||
|  |     install -D -g root -o root -m 0755 ${SCRIPTDIR}/simple-init@.service /usr/lib/systemd/system/simple-init@.service | ||||||
|  |     install -D -g root -o root -m 0644 ${SCRIPTDIR}/simple-init-udev.rules /etc/udev/rules.d/99-simple-init.rules | ||||||
|  | elif [ "$DIB_INIT_SYSTEM" == "sysv" ]; then | ||||||
|  |     install -D -g root -o root -m 0755 ${SCRIPTDIR}/simple-init.init /etc/init.d/simple-init | ||||||
|  |     update-rc.d simple-init defaults | ||||||
|  | fi | ||||||
							
								
								
									
										27
									
								
								elements/simple-init/install.d/60-simple-init-remove-interfaces
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										27
									
								
								elements/simple-init/install.d/60-simple-init-remove-interfaces
									
									
									
									
									
										Executable file
									
								
							| @@ -0,0 +1,27 @@ | |||||||
|  | #!/bin/bash | ||||||
|  |  | ||||||
|  | if [ ${DIB_DEBUG_TRACE:-0} -gt 0 ]; then | ||||||
|  |     set -x | ||||||
|  | fi | ||||||
|  | set -eu | ||||||
|  | set -o pipefail | ||||||
|  |  | ||||||
|  | # Cloud images may hard code the eth0 interfaces so they | ||||||
|  | # boot with DHCP. | ||||||
|  |  | ||||||
|  | # Fedora | ||||||
|  | rm -f /etc/sysconfig/network-scripts/ifcfg-eth0 | ||||||
|  |  | ||||||
|  | # Ubuntu | ||||||
|  | rm -f /etc/network/interfaces.d/eth0.cfg | ||||||
|  |  | ||||||
|  | # Debian | ||||||
|  | rm -f /etc/network/interfaces.d/eth0 | ||||||
|  |  | ||||||
|  | # /etc/network/interfaces distributions | ||||||
|  | if [ -f "/etc/network/interfaces" ]; then | ||||||
|  |     printf "auto lo\niface lo inet loopback\n\n" > /etc/network/interfaces | ||||||
|  |     if [ -d "/etc/network/interfaces.d/" ]; then | ||||||
|  |         printf "source-directory interfaces.d\n\n" >> /etc/network/interfaces | ||||||
|  |     fi | ||||||
|  | fi | ||||||
							
								
								
									
										24
									
								
								elements/simple-init/install.d/simple-init-repo-install/40-glean
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										24
									
								
								elements/simple-init/install.d/simple-init-repo-install/40-glean
									
									
									
									
									
										Executable file
									
								
							| @@ -0,0 +1,24 @@ | |||||||
|  | #!/bin/bash | ||||||
|  | # Copyright (c) 2015 Hewlett-Packard Development Company, L.P. | ||||||
|  | # | ||||||
|  | # Licensed under the Apache License, Version 2.0 (the "License"); | ||||||
|  | # you may not use this file except in compliance with the License. | ||||||
|  | # You may obtain a copy of the License at | ||||||
|  | # | ||||||
|  | #    http://www.apache.org/licenses/LICENSE-2.0 | ||||||
|  | # | ||||||
|  | # Unless required by applicable law or agreed to in writing, software | ||||||
|  | # distributed under the License is distributed on an "AS IS" BASIS, | ||||||
|  | # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or | ||||||
|  | # implied. | ||||||
|  | # | ||||||
|  | # See the License for the specific language governing permissions and | ||||||
|  | # limitations under the License. | ||||||
|  |  | ||||||
|  | if [ ${DIB_DEBUG_TRACE:-1} -gt 0 ]; then | ||||||
|  |     set -x | ||||||
|  | fi | ||||||
|  | set -eu | ||||||
|  | set -o pipefail | ||||||
|  |  | ||||||
|  | pip install /tmp/glean.git | ||||||
							
								
								
									
										24
									
								
								elements/simple-init/install.d/simple-init-source-install/40-glean
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										24
									
								
								elements/simple-init/install.d/simple-init-source-install/40-glean
									
									
									
									
									
										Executable file
									
								
							| @@ -0,0 +1,24 @@ | |||||||
|  | #!/bin/bash | ||||||
|  | # Copyright (c) 2015 Hewlett-Packard Development Company, L.P. | ||||||
|  | # | ||||||
|  | # Licensed under the Apache License, Version 2.0 (the "License"); | ||||||
|  | # you may not use this file except in compliance with the License. | ||||||
|  | # You may obtain a copy of the License at | ||||||
|  | # | ||||||
|  | #    http://www.apache.org/licenses/LICENSE-2.0 | ||||||
|  | # | ||||||
|  | # Unless required by applicable law or agreed to in writing, software | ||||||
|  | # distributed under the License is distributed on an "AS IS" BASIS, | ||||||
|  | # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or | ||||||
|  | # implied. | ||||||
|  | # | ||||||
|  | # See the License for the specific language governing permissions and | ||||||
|  | # limitations under the License. | ||||||
|  |  | ||||||
|  | if [ ${DIB_DEBUG_TRACE:-1} -gt 0 ]; then | ||||||
|  |     set -x | ||||||
|  | fi | ||||||
|  | set -eu | ||||||
|  | set -o pipefail | ||||||
|  |  | ||||||
|  | pip install glean | ||||||
							
								
								
									
										1
									
								
								elements/simple-init/install.d/simple-init-udev.rules
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								elements/simple-init/install.d/simple-init-udev.rules
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1 @@ | |||||||
|  | SUBSYSTEM=="net", ACTION=="add", TAG+="systemd", ENV{SYSTEMD_WANTS}+="simple-init@$name.service" | ||||||
							
								
								
									
										11
									
								
								elements/simple-init/install.d/simple-init.conf
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										11
									
								
								elements/simple-init/install.d/simple-init.conf
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,11 @@ | |||||||
|  | # Call a script to generate a /etc/network/interfaces file to DHCP all available interfaces | ||||||
|  | # Then remove this config file so the script is never run again | ||||||
|  |  | ||||||
|  | description "DHCP any connected, but unconfigured network interfaces" | ||||||
|  |  | ||||||
|  | start on starting network-interface | ||||||
|  | instance $INTERFACE | ||||||
|  |  | ||||||
|  | task | ||||||
|  |  | ||||||
|  | exec /usr/local/sbin/simple-init.sh $INTERFACE | ||||||
							
								
								
									
										31
									
								
								elements/simple-init/install.d/simple-init.init
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										31
									
								
								elements/simple-init/install.d/simple-init.init
									
									
									
									
									
										Executable file
									
								
							| @@ -0,0 +1,31 @@ | |||||||
|  | #!/bin/sh -e | ||||||
|  | ### BEGIN INIT INFO | ||||||
|  | # Provides:          simple-init | ||||||
|  | # Required-Start:    $local_fs | ||||||
|  | # Required-Stop:     $local_fs | ||||||
|  | # Default-Start:     S | ||||||
|  | # Default-Stop:      0 6 | ||||||
|  | # X-Start-Before:    networking | ||||||
|  | # Short-Description: Autodetect network interfaces | ||||||
|  | # Description:       Autodetect network interfaces during boot and configure them for DHCP | ||||||
|  | ### END INIT INFO | ||||||
|  |  | ||||||
|  | NAME=simple-init | ||||||
|  | INIT_NAME=/etc/init.d/${NAME} | ||||||
|  | SCRIPT_NAME=/usr/local/sbin/${NAME}.sh | ||||||
|  |  | ||||||
|  | [ -x $SCRIPT_NAME ] || exit 0 | ||||||
|  |  | ||||||
|  | case "$1" in | ||||||
|  |     start) | ||||||
|  |         $SCRIPT_NAME | ||||||
|  |         ;; | ||||||
|  |     stop) | ||||||
|  |         ;; | ||||||
|  |     *) | ||||||
|  |         echo "Usage: $INIT_NAME {start|stop}" | ||||||
|  |         exit 1 | ||||||
|  |         ;; | ||||||
|  | esac | ||||||
|  |  | ||||||
|  | exit 0 | ||||||
							
								
								
									
										49
									
								
								elements/simple-init/install.d/simple-init.sh
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										49
									
								
								elements/simple-init/install.d/simple-init.sh
									
									
									
									
									
										Executable file
									
								
							| @@ -0,0 +1,49 @@ | |||||||
|  | #!/bin/bash | ||||||
|  | # Licensed under the Apache License, Version 2.0 (the "License"); | ||||||
|  | # you may not use this file except in compliance with the License. | ||||||
|  | # You may obtain a copy of the License at | ||||||
|  | # | ||||||
|  | #    http://www.apache.org/licenses/LICENSE-2.0 | ||||||
|  | # | ||||||
|  | # Unless required by applicable law or agreed to in writing, software | ||||||
|  | # distributed under the License is distributed on an "AS IS" BASIS, | ||||||
|  | # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or | ||||||
|  | # implied. | ||||||
|  | # | ||||||
|  | # See the License for the specific language governing permissions and | ||||||
|  | # limitations under the License. | ||||||
|  |  | ||||||
|  | # dib-lint: disable=dibdebugtrace | ||||||
|  | set -eu | ||||||
|  | set -o pipefail | ||||||
|  |  | ||||||
|  | INTERFACE=${1:-} #optional, if not specified configure all available interfaces | ||||||
|  |  | ||||||
|  | function config_exists() { | ||||||
|  |     local interface=$1 | ||||||
|  |     if [ "$CONF_TYPE" == "netscripts" ]; then | ||||||
|  |         if [ -f "/etc/sysconfig/network-scripts/ifcfg-$interface" ]; then | ||||||
|  |             return 0 | ||||||
|  |         fi | ||||||
|  |     else | ||||||
|  |         ifquery $interface >/dev/null 2>&1 && return 0 || return 1 | ||||||
|  |     fi | ||||||
|  |     return 1 | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | # Test to see if config-drive exists. If not, skip and assume DHCP networking | ||||||
|  | # will work becasue sanity | ||||||
|  | if blkid -t LABEL="config-2" ; then | ||||||
|  |     # Mount config drive | ||||||
|  |     mkdir -p /mnt/config | ||||||
|  |     mount -o mode=0700 $(blkid -t LABEL="config-2" | cut -d ':' -f 1) /mnt/config || true | ||||||
|  |     /usr/local/bin/glean --ssh --skip-network | ||||||
|  | fi | ||||||
|  |  | ||||||
|  |  | ||||||
|  | if [ -n "$INTERFACE" ]; then | ||||||
|  |     /usr/local/bin/glean --interface $INTERFACE | ||||||
|  | else | ||||||
|  |     /usr/local/bin/glean | ||||||
|  | fi | ||||||
							
								
								
									
										15
									
								
								elements/simple-init/install.d/simple-init@.service
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										15
									
								
								elements/simple-init/install.d/simple-init@.service
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,15 @@ | |||||||
|  | [Unit] | ||||||
|  | Description=DHCP interface %I | ||||||
|  | After=network.service network.target | ||||||
|  |  | ||||||
|  | ConditionPathExists=!/etc/sysconfig/network-scripts/ifcfg-%I | ||||||
|  |  | ||||||
|  | [Service] | ||||||
|  | Type=oneshot | ||||||
|  | User=root | ||||||
|  | ExecStartPre=/usr/local/sbin/simple-init.sh %I | ||||||
|  | ExecStart=/sbin/ifup %I | ||||||
|  | RemainAfterExit=true | ||||||
|  |  | ||||||
|  | [Install] | ||||||
|  | WantedBy=multi-user.target | ||||||
							
								
								
									
										3
									
								
								elements/simple-init/package-installs.yaml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										3
									
								
								elements/simple-init/package-installs.yaml
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,3 @@ | |||||||
|  | isc-dhcp-client: | ||||||
|  | net-tools: | ||||||
|  | python-pip: | ||||||
							
								
								
									
										13
									
								
								elements/simple-init/pkg-map
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										13
									
								
								elements/simple-init/pkg-map
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,13 @@ | |||||||
|  | { | ||||||
|  |   "family": { | ||||||
|  |     "redhat": { | ||||||
|  |       "isc-dhcp-client": "dhclient" | ||||||
|  |     }, | ||||||
|  |     "debian": { | ||||||
|  |       "isc-dhcp-client": "isc-dhcp-client" | ||||||
|  |     } | ||||||
|  |   }, | ||||||
|  |   "default": { | ||||||
|  |     "isc-dhcp-client": "isc-dhcp-client" | ||||||
|  |   } | ||||||
|  | } | ||||||
							
								
								
									
										1
									
								
								elements/simple-init/source-repository-simple-init
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								elements/simple-init/source-repository-simple-init
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1 @@ | |||||||
|  | glean git /tmp/glean.git https://gitorious.org/mordred-temp/glean.git | ||||||
| @@ -2,5 +2,6 @@ adduser: | |||||||
| locales: | locales: | ||||||
| ca-certificates: | ca-certificates: | ||||||
| cloud-initramfs-growroot: | cloud-initramfs-growroot: | ||||||
|  | linux-image-generic: | ||||||
| lsb-release: | lsb-release: | ||||||
|   phase: pre-install.d |   phase: pre-install.d | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user
	 Jenkins
					Jenkins