← Back to team overview

cloud-init-dev team mailing list archive

Re: [Merge] ~raharper/cloud-init:fix/debian-config-yaml-spaces into cloud-init:ubuntu/devel

 

OK, I've combined Chad's clean-up and then emitted that as the value, like this:


LISTVAL="$(sed -e "s/\s//g" -e "/^$key:/"'!'d \
               -e "s/$key:\[//;s/]//;s/,/, /g" "$file")"
RET="$key: [ ${LISTVAL} ]"

In action looks like this:

# Edge-case, single entry
root@x1:~# cat /etc/cloud/cloud.cfg.d/90_dpkg.cfg
# to update this file, run dpkg-reconfigure cloud-init
datasource_list: [ ConfigDrive ]
root@x1:~# ./test3.sh /etc/cloud/cloud.cfg.d/90_dpkg.cfg
datasource_list: [ ConfigDrive ]

# Edge-case, empty
root@x1:~# cat /etc/cloud/cloud.cfg.d/90_dpkg.cfg.empty 
# to update this file, run dpkg-reconfigure cloud-init
datasource_list: []
root@x1:~# ./test3.sh /etc/cloud/cloud.cfg.d/90_dpkg.cfg.empty 
datasource_list: [ ]

# the bug case
root@x1:~# cat /etc/cloud/cloud.cfg.d/90_dpkg.cfg.bad 
# to update this file, run dpkg-reconfigure cloud-init
datasource_list: [ConfigDrive, None]
root@x1:~# ./test3.sh /etc/cloud/cloud.cfg.d/90_dpkg.cfg.bad 
datasource_list: [ ConfigDrive, None ]

# the default case
root@x1:~# cat /etc/cloud/cloud.cfg.d/90_dpkg.cfg.new 
s file, run dpkg-reconfigure cloud-init
datasource_list: [ NoCloud, ConfigDrive, OpenNebula, DigitalOcean, Azure, AltCloud, OVF, MAAS, GCE, OpenStack, CloudSigma, SmartOS, Bigstep, Scaleway, AliYun, Ec2, CloudStack, Hetzner, IBMCloud, Oracle, Exoscale, None] 
root@x1:~# ./test3.sh /etc/cloud/cloud.cfg.d/90_dpkg.cfg.new 
datasource_list: [ NoCloud, ConfigDrive, OpenNebula, DigitalOcean, Azure, AltCloud, OVF, MAAS, GCE, OpenStack, CloudSigma, SmartOS, Bigstep, Scaleway, AliYun, Ec2, CloudStack, Hetzner, IBMCloud, Oracle, Exoscale, None ]


Diff comments:

> diff --git a/debian/cloud-init.config b/debian/cloud-init.config
> index 6e9c6f7..adaabb8 100644
> --- a/debian/cloud-init.config
> +++ b/debian/cloud-init.config
> @@ -32,13 +32,13 @@ hasEc2Md() {
>  get_yaml_list() {
>  	# get_yaml_list(file, key, def): return a comma delimited list with the value
>  	# for the yaml array defined in 'key' from 'file'. if not found , return 'def'
> -	# only really supports 'key: [en1, en2 ]' format.
> +	# only really supports 'key: [ en1, en2 ]' or 'key: [en1, en2]' formats.
>  	local file="$1" key="$2" default="$3"
>  	[ -f "$file" ] || return 1
> -	# any thing that didn't match the key is deleted so the final 'p' only
> -	# prints things that matched.
> -	RET=$(sed -n -e "/^$key:/"'!'d -e "s/$key:[ \[]*//"\
> -		-e "s, \]$,," -e p "$file")
> +	# strip all whitespace, delete lines not matching key:,
> +	# strip key: and [] and replace ',' with ', '
> +	RET=$(sed -e "s/\s//g" -e "/^$key:/"'!'d\
> +		  -e "s/$key:\[//;s/]//;s/,/, /g" $file)

And it doesn't quite work; should have tested first:

RET=$(sed -e "s/\s//g" -e "/^$key:/"'!'d -e "s/$key:\[//;s/]//;s/,/, /g" "$file")

produces:

# ./test3.sh /etc/cloud/cloud.cfg.d/90_dpkg.cfg.bad 
+ get_yaml_list /etc/cloud/cloud.cfg.d/90_dpkg.cfg.bad datasource_list NOTFOUND
+ local file=/etc/cloud/cloud.cfg.d/90_dpkg.cfg.bad key=datasource_list default=NOTFOUND
+ [ -f /etc/cloud/cloud.cfg.d/90_dpkg.cfg.bad ]
+ sed -e s/\s//g -e /^datasource_list:/!d -e s/datasource_list:\[//;s/]//;s/,/, /g /etc/cloud/cloud.cfg.d/90_dpkg.cfg.bad
+ RET=ConfigDrive, None
+ [ -n ConfigDrive, None ]
+ echo ConfigDrive, None
ConfigDrive, None

So, well spaced list, but missing key and brackets.

>  	[ -n "$RET" ] || RET="$default"
>  }
>  


-- 
https://code.launchpad.net/~raharper/cloud-init/+git/cloud-init/+merge/371919
Your team cloud-init commiters is requested to review the proposed merge of ~raharper/cloud-init:fix/debian-config-yaml-spaces into cloud-init:ubuntu/devel.


References