mirror of
				https://github.com/kubernetes-sigs/external-dns.git
				synced 2025-11-04 04:31:00 +01:00 
			
		
		
		
	Implement plural provider
add plural to provider enum go mod tidy remove gitlab-ci Signed-off-by: DavidSpek <vanderspek.david@gmail.com> cleanup Signed-off-by: DavidSpek <vanderspek.david@gmail.com>
This commit is contained in:
		
							parent
							
								
									b86d8f9217
								
							
						
					
					
						commit
						12f46d1e01
					
				
							
								
								
									
										8
									
								
								go.mod
									
									
									
									
									
								
							
							
						
						
									
										8
									
								
								go.mod
									
									
									
									
									
								
							@ -182,6 +182,8 @@ require (
 | 
			
		||||
	sigs.k8s.io/yaml v1.3.0 // indirect
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
require github.com/michaeljguarino/graphql v0.2.5
 | 
			
		||||
 | 
			
		||||
require (
 | 
			
		||||
	github.com/emicklei/go-restful/v3 v3.9.0 // indirect
 | 
			
		||||
	github.com/go-openapi/jsonpointer v0.19.5 // indirect
 | 
			
		||||
@ -190,8 +192,12 @@ require (
 | 
			
		||||
	github.com/google/gnostic v0.6.9 // indirect
 | 
			
		||||
	github.com/googleapis/enterprise-certificate-proxy v0.1.0 // indirect
 | 
			
		||||
	github.com/josharian/intern v1.0.0 // indirect
 | 
			
		||||
	github.com/mailru/easyjson v0.7.7 // indirect
 | 
			
		||||
	github.com/mailru/easyjson v0.7.6 // indirect
 | 
			
		||||
	github.com/mattn/go-runewidth v0.0.13 // indirect
 | 
			
		||||
	github.com/mitchellh/colorstring v0.0.0-20190213212951-d06e56a500db // indirect
 | 
			
		||||
	github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect
 | 
			
		||||
	github.com/rivo/uniseg v0.2.0 // indirect
 | 
			
		||||
	github.com/schollz/progressbar/v3 v3.7.6 // indirect
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
replace k8s.io/klog/v2 => github.com/Raffo/knolog v0.0.0-20211016155154-e4d5e0cc970a
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										19
									
								
								go.sum
									
									
									
									
									
								
							
							
						
						
									
										19
									
								
								go.sum
									
									
									
									
									
								
							@ -159,6 +159,7 @@ github.com/Shopify/toxiproxy v2.1.4+incompatible/go.mod h1:OXgGpZ6Cli1/URJOF1DMx
 | 
			
		||||
github.com/StackExchange/dnscontrol v0.2.8 h1:7jviqDH9cIqRSRpH0UxgmpT7a8CwEhs9mLHBhoYhXo8=
 | 
			
		||||
github.com/StackExchange/dnscontrol v0.2.8/go.mod h1:BH+5nX50JxHDdb3+AD/z/UfYMCc7iaqEkRtQ+NjcFGE=
 | 
			
		||||
github.com/Venafi/vcert/v4 v4.14.3/go.mod h1:IL+6LA8QRWZbmcMzIr/vRhf9Aa6XDM2cQO50caWevjA=
 | 
			
		||||
github.com/VividCortex/ewma v1.1.1/go.mod h1:2Tkkvm3sRDVXaiyucHiACn4cqf7DpdyLvmxzcbUokwA=
 | 
			
		||||
github.com/VividCortex/gohistogram v1.0.0/go.mod h1:Pf5mBqqDxYaXu3hDrrU+w6nw50o/4+TcAqDqk/vUH7g=
 | 
			
		||||
github.com/afex/hystrix-go v0.0.0-20180502004556-fa1af6a1f4f5/go.mod h1:SkGFH1ia65gfNATL8TAiHDNxPzPdmEL5uirI2Uyuz6c=
 | 
			
		||||
github.com/agnivade/levenshtein v1.0.1/go.mod h1:CURSv5d9Uaml+FovSIICkLbAUZ9S4RqaHDIsdSBg7lM=
 | 
			
		||||
@ -264,6 +265,7 @@ github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XL
 | 
			
		||||
github.com/cespare/xxhash/v2 v2.1.2 h1:YRXhKfTDauu4ajMg1TPgFO5jnlC2HCbmLXMcTG5cbYE=
 | 
			
		||||
github.com/cespare/xxhash/v2 v2.1.2/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
 | 
			
		||||
github.com/chai2010/gettext-go v0.0.0-20160711120539-c6fed771bfd5/go.mod h1:/iP1qXHoty45bqomnu2LM+VVyAEdWN+vtSHGlQgyxbw=
 | 
			
		||||
github.com/cheggaaa/pb/v3 v3.0.4/go.mod h1:7rgWxLrAUcFMkvJuv09+DYi7mMUYi8nO9iOWcvGJPfw=
 | 
			
		||||
github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI=
 | 
			
		||||
github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI=
 | 
			
		||||
github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU=
 | 
			
		||||
@ -921,6 +923,7 @@ github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7V
 | 
			
		||||
github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM=
 | 
			
		||||
github.com/jung-kurt/gofpdf v1.0.0/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes=
 | 
			
		||||
github.com/jung-kurt/gofpdf v1.0.3-0.20190309125859-24315acbbda5/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes=
 | 
			
		||||
github.com/k0kubun/go-ansi v0.0.0-20180517002512-3bf9e2903213/go.mod h1:vNUNkEQ1e29fT/6vq2aBdFsgNPmy8qMdSay1npru+Sw=
 | 
			
		||||
github.com/karrick/godirwalk v1.8.0/go.mod h1:H5KPZjojv4lE+QYImBI8xVtrBRgYrIVsaRPx4tDPEn4=
 | 
			
		||||
github.com/karrick/godirwalk v1.10.3/go.mod h1:RoGL9dQei4vP9ilrpETWE8CLOZ1kiN0LhBygSwrAsHA=
 | 
			
		||||
github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51/go.mod h1:CzGEWj7cYgsdH8dAjBGEr58BoE7ScuLd+fwFZ44+/x8=
 | 
			
		||||
@ -987,6 +990,8 @@ github.com/markbates/safe v1.0.1/go.mod h1:nAqgmRi7cY2nqMc92/bSEeQA+R4OheNU2T1kN
 | 
			
		||||
github.com/marstr/guid v1.1.0/go.mod h1:74gB1z2wpxxInTG6yaqA7KrtM0NZ+RbrcqDvYHefzho=
 | 
			
		||||
github.com/martini-contrib/render v0.0.0-20150707142108-ec18f8345a11 h1:YFh+sjyJTMQSYjKwM4dFKhJPJC/wfo98tPUc17HdoYw=
 | 
			
		||||
github.com/martini-contrib/render v0.0.0-20150707142108-ec18f8345a11/go.mod h1:Ah2dBMoxZEqk118as2T4u4fjfXarE0pPnMJaArZQZsI=
 | 
			
		||||
github.com/matryer/is v1.2.0 h1:92UTHpy8CDwaJ08GqLDzhhuixiBUUD1p3AU6PHddz4A=
 | 
			
		||||
github.com/matryer/is v1.2.0/go.mod h1:2fLPjFQM9rhQ15aVEtbuwhJinnOqrmgXPNdZsdwlWXA=
 | 
			
		||||
github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU=
 | 
			
		||||
github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE=
 | 
			
		||||
github.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE=
 | 
			
		||||
@ -1008,6 +1013,9 @@ github.com/mattn/go-runewidth v0.0.2/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzp
 | 
			
		||||
github.com/mattn/go-runewidth v0.0.4/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU=
 | 
			
		||||
github.com/mattn/go-runewidth v0.0.7/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI=
 | 
			
		||||
github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI=
 | 
			
		||||
github.com/mattn/go-runewidth v0.0.10/go.mod h1:RAqKPSqVFrSLVXbA8x7dzmKdmGzieGRCM46jaSJTDAk=
 | 
			
		||||
github.com/mattn/go-runewidth v0.0.13 h1:lTGmDsbAYt5DmK6OnoV7EuIF1wEIFAcxld6ypU4OSgU=
 | 
			
		||||
github.com/mattn/go-runewidth v0.0.13/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w=
 | 
			
		||||
github.com/mattn/go-shellwords v1.0.10/go.mod h1:EZzvwXDESEeg03EKmM+RmDnNOPKG4lLtQsUlTZDWQ8Y=
 | 
			
		||||
github.com/mattn/go-shellwords v1.0.11/go.mod h1:EZzvwXDESEeg03EKmM+RmDnNOPKG4lLtQsUlTZDWQ8Y=
 | 
			
		||||
github.com/mattn/go-sqlite3 v1.9.0/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc=
 | 
			
		||||
@ -1019,6 +1027,8 @@ github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182aff
 | 
			
		||||
github.com/maxatome/go-testdeep v1.11.0 h1:Tgh5efyCYyJFGUYiT0qxBSIDeXw0F5zSoatlou685kk=
 | 
			
		||||
github.com/maxatome/go-testdeep v1.11.0/go.mod h1:011SgQ6efzZYAen6fDn4BqQ+lUR72ysdyKe7Dyogw70=
 | 
			
		||||
github.com/mholt/archiver/v3 v3.3.0/go.mod h1:YnQtqsp+94Rwd0D/rk5cnLrxusUBUXg+08Ebtr1Mqao=
 | 
			
		||||
github.com/michaeljguarino/graphql v0.2.5 h1:fCjyit9aNOE7Y9Riapv6Ze67D3Y1GH7+zq11A0xVrks=
 | 
			
		||||
github.com/michaeljguarino/graphql v0.2.5/go.mod h1:0IJi2e5NE+cDl9am41kqsaSI0vZ1aAD0A2SerCWEOas=
 | 
			
		||||
github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg=
 | 
			
		||||
github.com/miekg/dns v1.1.6/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg=
 | 
			
		||||
github.com/miekg/dns v1.1.26/go.mod h1:bPDLeHnStXmXAq1m/Ch/hvfNHr14JKNPMBo3VZKjuso=
 | 
			
		||||
@ -1029,6 +1039,8 @@ github.com/miekg/dns v1.1.48 h1:Ucfr7IIVyMBz4lRE8qmGUuZ4Wt3/ZGu9hmcMT3Uu4tQ=
 | 
			
		||||
github.com/miekg/dns v1.1.48/go.mod h1:e3IlAVfNqAllflbibAZEWOXOQ+Ynzk/dDozDxY7XnME=
 | 
			
		||||
github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc=
 | 
			
		||||
github.com/mitchellh/cli v1.1.0/go.mod h1:xcISNoH86gajksDmfB23e/pu+B+GeFRMYmoHXxx3xhI=
 | 
			
		||||
github.com/mitchellh/colorstring v0.0.0-20190213212951-d06e56a500db h1:62I3jR2EmQ4l5rM/4FEfDWcRD+abF5XlKShorW5LRoQ=
 | 
			
		||||
github.com/mitchellh/colorstring v0.0.0-20190213212951-d06e56a500db/go.mod h1:l0dey0ia/Uv7NcFFVbCLtqEBQbrT4OCwCSKTEv6enCw=
 | 
			
		||||
github.com/mitchellh/copystructure v1.0.0/go.mod h1:SNtv71yrdKgLRyLFxmLdkAbkKEFWgYaq1OVrnRcwhnw=
 | 
			
		||||
github.com/mitchellh/copystructure v1.1.1/go.mod h1:EBArHfARyrSWO/+Wyr9zwEkc6XMFB9XyNgFNmRkZZU4=
 | 
			
		||||
github.com/mitchellh/go-homedir v1.0.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0=
 | 
			
		||||
@ -1249,6 +1261,9 @@ github.com/prometheus/procfs v0.7.3 h1:4jVXhlkAyzOScmCkXBTOLRLTz8EeU+eyjrwB/EPq0
 | 
			
		||||
github.com/prometheus/procfs v0.7.3/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA=
 | 
			
		||||
github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU=
 | 
			
		||||
github.com/rcrowley/go-metrics v0.0.0-20181016184325-3113b8401b8a/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4=
 | 
			
		||||
github.com/rivo/uniseg v0.1.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc=
 | 
			
		||||
github.com/rivo/uniseg v0.2.0 h1:S1pD9weZBuJdFmowNwbpi7BJ8TNftyUImj/0WQi72jY=
 | 
			
		||||
github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc=
 | 
			
		||||
github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg=
 | 
			
		||||
github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ=
 | 
			
		||||
github.com/rogpeppe/go-internal v1.1.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=
 | 
			
		||||
@ -1276,6 +1291,8 @@ github.com/samuel/go-zookeeper v0.0.0-20190923202752-2cc03de413da/go.mod h1:gi+0
 | 
			
		||||
github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0=
 | 
			
		||||
github.com/scaleway/scaleway-sdk-go v1.0.0-beta.7.0.20210127161313-bd30bebeac4f h1:WSnaD0/cvbKJgSTYbjAPf4RJXVvNNDAwVm+W8wEmnGE=
 | 
			
		||||
github.com/scaleway/scaleway-sdk-go v1.0.0-beta.7.0.20210127161313-bd30bebeac4f/go.mod h1:CJJ5VAbozOl0yEw7nHB9+7BXTJbIn6h7W+f6Gau5IP8=
 | 
			
		||||
github.com/schollz/progressbar/v3 v3.7.6 h1:akAvVpTy2IAcePWYndctoBaY9bLE3z4LE1Hn91BJ9g4=
 | 
			
		||||
github.com/schollz/progressbar/v3 v3.7.6/go.mod h1:Y9mmL2knZj3LUaBDyBEzFdPrymIr08hnlFMZmfxwbx4=
 | 
			
		||||
github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc=
 | 
			
		||||
github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo=
 | 
			
		||||
github.com/sergi/go-diff v1.1.0/go.mod h1:STckp+ISIX8hZLjrqAeVduY0gWCT9IjLuqbuNXdaHfM=
 | 
			
		||||
@ -1754,6 +1771,7 @@ golang.org/x/sys v0.0.0-20191008105621-543471e840be/go.mod h1:h1NjWce9XRLGQEsW7w
 | 
			
		||||
golang.org/x/sys v0.0.0-20191022100944-742c48ecaeb7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 | 
			
		||||
golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 | 
			
		||||
golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 | 
			
		||||
golang.org/x/sys v0.0.0-20191128015809-6d18c012aee9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 | 
			
		||||
golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 | 
			
		||||
golang.org/x/sys v0.0.0-20191220142924-d4481acd189f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 | 
			
		||||
golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 | 
			
		||||
@ -1791,6 +1809,7 @@ golang.org/x/sys v0.0.0-20210112080510-489259a85091/go.mod h1:h1NjWce9XRLGQEsW7w
 | 
			
		||||
golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 | 
			
		||||
golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 | 
			
		||||
golang.org/x/sys v0.0.0-20210220050731-9a76102bfb43/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 | 
			
		||||
golang.org/x/sys v0.0.0-20210223095934-7937bea0104d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 | 
			
		||||
golang.org/x/sys v0.0.0-20210225134936-a50acf3fe073/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 | 
			
		||||
golang.org/x/sys v0.0.0-20210303074136-134d130e1a04/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 | 
			
		||||
golang.org/x/sys v0.0.0-20210304124612-50617c2ba197/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										5
									
								
								main.go
									
									
									
									
									
								
							
							
						
						
									
										5
									
								
								main.go
									
									
									
									
									
								
							@ -60,6 +60,7 @@ import (
 | 
			
		||||
	"sigs.k8s.io/external-dns/provider/oci"
 | 
			
		||||
	"sigs.k8s.io/external-dns/provider/ovh"
 | 
			
		||||
	"sigs.k8s.io/external-dns/provider/pdns"
 | 
			
		||||
	"sigs.k8s.io/external-dns/provider/plural"
 | 
			
		||||
	"sigs.k8s.io/external-dns/provider/rcode0"
 | 
			
		||||
	"sigs.k8s.io/external-dns/provider/rdns"
 | 
			
		||||
	"sigs.k8s.io/external-dns/provider/rfc2136"
 | 
			
		||||
@ -338,7 +339,9 @@ func main() {
 | 
			
		||||
		p, err = ibmcloud.NewIBMCloudProvider(cfg.IBMCloudConfigFile, domainFilter, zoneIDFilter, endpointsSource, cfg.IBMCloudProxied, cfg.DryRun)
 | 
			
		||||
	case "safedns":
 | 
			
		||||
		p, err = safedns.NewSafeDNSProvider(domainFilter, cfg.DryRun)
 | 
			
		||||
	case "tencentcloud":
 | 
			
		||||
	case "plural":
 | 
			
		||||
		p, err = plural.NewPluralProvider(cfg.PluralCluster, cfg.PluralProvider)
 | 
			
		||||
        case "tencentcloud":
 | 
			
		||||
		p, err = tencentcloud.NewTencentCloudProvider(domainFilter, zoneIDFilter, cfg.TencentCloudConfigFile, cfg.TencentCloudZoneType, cfg.DryRun)
 | 
			
		||||
	default:
 | 
			
		||||
		log.Fatalf("unknown dns provider: %s", cfg.Provider)
 | 
			
		||||
 | 
			
		||||
@ -194,6 +194,8 @@ type Config struct {
 | 
			
		||||
	IBMCloudConfigFile                string
 | 
			
		||||
	TencentCloudConfigFile            string
 | 
			
		||||
	TencentCloudZoneType              string
 | 
			
		||||
	PluralCluster                     string
 | 
			
		||||
	PluralProvider                    string
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
var defaultConfig = &Config{
 | 
			
		||||
@ -225,7 +227,6 @@ var defaultConfig = &Config{
 | 
			
		||||
	GoogleBatchChangeInterval:   time.Second,
 | 
			
		||||
	GoogleZoneVisibility:        "",
 | 
			
		||||
	DomainFilter:                []string{},
 | 
			
		||||
	ZoneIDFilter:                []string{},
 | 
			
		||||
	ExcludeDomains:              []string{},
 | 
			
		||||
	RegexDomainFilter:           regexp.MustCompile(""),
 | 
			
		||||
	RegexDomainExclusion:        regexp.MustCompile(""),
 | 
			
		||||
@ -331,6 +332,8 @@ var defaultConfig = &Config{
 | 
			
		||||
	IBMCloudConfigFile:          "/etc/kubernetes/ibmcloud.json",
 | 
			
		||||
	TencentCloudConfigFile:      "/etc/kubernetes/tencent-cloud.json",
 | 
			
		||||
	TencentCloudZoneType:        "",
 | 
			
		||||
	PluralCluster:               "",
 | 
			
		||||
	PluralProvider:              "",
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// NewConfig returns new Config object
 | 
			
		||||
@ -420,7 +423,7 @@ func (cfg *Config) ParseFlags(args []string) error {
 | 
			
		||||
	app.Flag("exclude-target-net", "Exclude target nets (optional)").StringsVar(&cfg.ExcludeTargetNets)
 | 
			
		||||
 | 
			
		||||
	// Flags related to providers
 | 
			
		||||
	app.Flag("provider", "The DNS provider where the DNS records will be created (required, options: aws, aws-sd, godaddy, google, azure, azure-dns, azure-private-dns, bluecat, civo, cloudflare, rcodezero, digitalocean, dnsimple, akamai, infoblox, dyn, designate, coredns, skydns, ibmcloud, inmemory, ovh, pdns, oci, exoscale, linode, rfc2136, ns1, transip, vinyldns, rdns, scaleway, vultr, ultradns, gandi, safedns, tencentcloud)").Required().PlaceHolder("provider").EnumVar(&cfg.Provider, "aws", "aws-sd", "google", "azure", "azure-dns", "azure-private-dns", "alibabacloud", "civo", "cloudflare", "rcodezero", "digitalocean", "dnsimple", "akamai", "infoblox", "dyn", "designate", "coredns", "skydns", "ibmcloud", "inmemory", "ovh", "pdns", "oci", "exoscale", "linode", "rfc2136", "ns1", "transip", "vinyldns", "rdns", "scaleway", "vultr", "ultradns", "godaddy", "bluecat", "gandi", "safedns", "tencentcloud")
 | 
			
		||||
	app.Flag("provider", "The DNS provider where the DNS records will be created (required, options: aws, aws-sd, godaddy, google, azure, azure-dns, azure-private-dns, bluecat, civo, cloudflare, rcodezero, digitalocean, dnsimple, akamai, infoblox, dyn, designate, coredns, skydns, ibmcloud, inmemory, ovh, pdns, oci, exoscale, linode, rfc2136, ns1, transip, vinyldns, rdns, scaleway, vultr, ultradns, gandi, safedns, tencentcloud)").Required().PlaceHolder("provider").EnumVar(&cfg.Provider, "aws", "aws-sd", "google", "azure", "azure-dns", "azure-private-dns", "alibabacloud", "civo", "cloudflare", "rcodezero", "digitalocean", "dnsimple", "akamai", "infoblox", "dyn", "designate", "coredns", "skydns", "ibmcloud", "inmemory", "ovh", "pdns", "oci", "exoscale", "linode", "rfc2136", "ns1", "transip", "vinyldns", "rdns", "scaleway", "vultr", "ultradns", "godaddy", "bluecat", "gandi", "safedns", "tencentcloud", "plural")
 | 
			
		||||
	app.Flag("domain-filter", "Limit possible target zones by a domain suffix; specify multiple times for multiple domains (optional)").Default("").StringsVar(&cfg.DomainFilter)
 | 
			
		||||
	app.Flag("exclude-domains", "Exclude subdomains (optional)").Default("").StringsVar(&cfg.ExcludeDomains)
 | 
			
		||||
	app.Flag("regex-domain-filter", "Limit possible domains and target zones by a Regex filter; Overrides domain-filter (optional)").Default(defaultConfig.RegexDomainFilter.String()).RegexpVar(&cfg.RegexDomainFilter)
 | 
			
		||||
@ -448,8 +451,6 @@ func (cfg *Config) ParseFlags(args []string) error {
 | 
			
		||||
	app.Flag("azure-resource-group", "When using the Azure provider, override the Azure resource group to use (required when --provider=azure-private-dns)").Default(defaultConfig.AzureResourceGroup).StringVar(&cfg.AzureResourceGroup)
 | 
			
		||||
	app.Flag("azure-subscription-id", "When using the Azure provider, specify the Azure configuration file (required when --provider=azure-private-dns)").Default(defaultConfig.AzureSubscriptionID).StringVar(&cfg.AzureSubscriptionID)
 | 
			
		||||
	app.Flag("azure-user-assigned-identity-client-id", "When using the Azure provider, override the client id of user assigned identity in config file (optional)").Default("").StringVar(&cfg.AzureUserAssignedIdentityClientID)
 | 
			
		||||
	app.Flag("tencent-cloud-config-file", "When using the Tencent Cloud provider, specify the Tencent Cloud configuration file (required when --provider=tencentcloud").Default(defaultConfig.TencentCloudConfigFile).StringVar(&cfg.TencentCloudConfigFile)
 | 
			
		||||
	app.Flag("tencent-cloud-zone-type", "When using the Tencent Cloud provider, filter for zones with visibility (optional, options: public, private)").Default(defaultConfig.TencentCloudZoneType).EnumVar(&cfg.TencentCloudZoneType, "", "public", "private")
 | 
			
		||||
 | 
			
		||||
	// Flags related to BlueCat provider
 | 
			
		||||
	app.Flag("bluecat-dns-configuration", "When using the Bluecat provider, specify the Bluecat DNS configuration string (optional when --provider=bluecat)").Default("").StringVar(&cfg.BluecatDNSConfiguration)
 | 
			
		||||
@ -534,6 +535,10 @@ func (cfg *Config) ParseFlags(args []string) error {
 | 
			
		||||
	app.Flag("transip-account", "When using the TransIP provider, specify the account name (required when --provider=transip)").Default(defaultConfig.TransIPAccountName).StringVar(&cfg.TransIPAccountName)
 | 
			
		||||
	app.Flag("transip-keyfile", "When using the TransIP provider, specify the path to the private key file (required when --provider=transip)").Default(defaultConfig.TransIPPrivateKeyFile).StringVar(&cfg.TransIPPrivateKeyFile)
 | 
			
		||||
 | 
			
		||||
	// Flags related to the Plural provider
 | 
			
		||||
	app.Flag("plural-cluster", "When using the plural provider, specify the cluster name you're running with").Default(defaultConfig.PluralCluster).StringVar(&cfg.PluralCluster)
 | 
			
		||||
	app.Flag("plural-provider", "When using the plural provider, specify the provider name you're running with").Default(defaultConfig.PluralProvider).StringVar(&cfg.PluralProvider)
 | 
			
		||||
 | 
			
		||||
	// Flags related to policies
 | 
			
		||||
	app.Flag("policy", "Modify how DNS records are synchronized between sources and providers (default: sync, options: sync, upsert-only, create-only)").Default(defaultConfig.Policy).EnumVar(&cfg.Policy, "sync", "upsert-only", "create-only")
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										131
									
								
								provider/plural/client.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										131
									
								
								provider/plural/client.go
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,131 @@
 | 
			
		||||
package plural
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"context"
 | 
			
		||||
	"fmt"
 | 
			
		||||
	"strings"
 | 
			
		||||
 | 
			
		||||
	"github.com/michaeljguarino/graphql"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
type Config struct {
 | 
			
		||||
	Token    string
 | 
			
		||||
	Endpoint string
 | 
			
		||||
	Cluster  string
 | 
			
		||||
	Provider string
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
type Client struct {
 | 
			
		||||
	gqlClient *graphql.Client
 | 
			
		||||
	config    *Config
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
type DnsRecord struct {
 | 
			
		||||
	Type    string
 | 
			
		||||
	Name    string
 | 
			
		||||
	Records []string
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
const DnsRecordFragment = `
 | 
			
		||||
	fragment DnsRecord on DnsRecord {
 | 
			
		||||
		type
 | 
			
		||||
		name
 | 
			
		||||
		records
 | 
			
		||||
	}
 | 
			
		||||
`
 | 
			
		||||
 | 
			
		||||
var dnsRecordsQuery = fmt.Sprintf(`
 | 
			
		||||
	query DnsRecords($cluster: String!, $provider: Provider!) {
 | 
			
		||||
		dnsRecords(cluster: $cluster, provider: $provider, first: 500) {
 | 
			
		||||
			edges { node { ...DnsRecord } }
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	%s
 | 
			
		||||
`, DnsRecordFragment)
 | 
			
		||||
 | 
			
		||||
var createDnsRecord = fmt.Sprintf(`
 | 
			
		||||
	mutation Create($cluster: String!, $provider: Provider!, $attributes: DnsRecordAttributes!) {
 | 
			
		||||
		createDnsRecord(cluster: $cluster, provider: $provider, attributes: $attributes) {
 | 
			
		||||
			...DnsRecord
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	%s
 | 
			
		||||
`, DnsRecordFragment)
 | 
			
		||||
 | 
			
		||||
var deleteDnsRecord = fmt.Sprintf(`
 | 
			
		||||
	mutation Delete($name: String!, $type: DnsRecordType!) {
 | 
			
		||||
		deleteDnsRecord(name: $name, type: $type) {
 | 
			
		||||
			...DnsRecord
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	%s
 | 
			
		||||
`, DnsRecordFragment)
 | 
			
		||||
 | 
			
		||||
func NewClient(conf *Config) *Client {
 | 
			
		||||
	base := conf.BaseUrl()
 | 
			
		||||
	return &Client{graphql.NewClient(base + "/gql"), conf}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (c *Config) BaseUrl() string {
 | 
			
		||||
	host := "https://app.plural.sh"
 | 
			
		||||
	if c.Endpoint != "" {
 | 
			
		||||
		host = fmt.Sprintf("https://%s", c.Endpoint)
 | 
			
		||||
	}
 | 
			
		||||
	return host
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (client *Client) Build(doc string) *graphql.Request {
 | 
			
		||||
	req := graphql.NewRequest(doc)
 | 
			
		||||
	req.Header.Set("Authorization", "Bearer "+client.config.Token)
 | 
			
		||||
	return req
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (client *Client) Run(req *graphql.Request, resp interface{}) error {
 | 
			
		||||
	return client.gqlClient.Run(context.Background(), req, &resp)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (client *Client) DnsRecords() (records []*DnsRecord, err error) {
 | 
			
		||||
	var resp struct {
 | 
			
		||||
		DnsRecords struct {
 | 
			
		||||
			Edges []struct {
 | 
			
		||||
				Node *DnsRecord
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	req := client.Build(dnsRecordsQuery)
 | 
			
		||||
	req.Var("cluster", client.config.Cluster)
 | 
			
		||||
	req.Var("provider", strings.ToUpper(client.config.Provider))
 | 
			
		||||
	err = client.Run(req, &resp)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	records = make([]*DnsRecord, len(resp.DnsRecords.Edges))
 | 
			
		||||
	for i, edge := range resp.DnsRecords.Edges {
 | 
			
		||||
		records[i] = edge.Node
 | 
			
		||||
	}
 | 
			
		||||
	return
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (client *Client) CreateRecord(record *DnsRecord) (result *DnsRecord, err error) {
 | 
			
		||||
	var resp struct {
 | 
			
		||||
		CreateDnsRecord *DnsRecord
 | 
			
		||||
	}
 | 
			
		||||
	req := client.Build(createDnsRecord)
 | 
			
		||||
	req.Var("cluster", client.config.Cluster)
 | 
			
		||||
	req.Var("provider", strings.ToUpper(client.config.Provider))
 | 
			
		||||
	req.Var("attributes", record)
 | 
			
		||||
	err = client.Run(req, &resp)
 | 
			
		||||
	result = resp.CreateDnsRecord
 | 
			
		||||
	return
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (client *Client) DeleteRecord(name, ttype string) error {
 | 
			
		||||
	var resp struct {
 | 
			
		||||
		DeleteDnsRecord *DnsRecord
 | 
			
		||||
	}
 | 
			
		||||
	req := client.Build(deleteDnsRecord)
 | 
			
		||||
	req.Var("type", ttype)
 | 
			
		||||
	req.Var("name", name)
 | 
			
		||||
	return client.Run(req, &resp)
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										122
									
								
								provider/plural/plural.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										122
									
								
								provider/plural/plural.go
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,122 @@
 | 
			
		||||
package plural
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"context"
 | 
			
		||||
	"fmt"
 | 
			
		||||
	"os"
 | 
			
		||||
 | 
			
		||||
	log "github.com/sirupsen/logrus"
 | 
			
		||||
	"sigs.k8s.io/external-dns/endpoint"
 | 
			
		||||
	"sigs.k8s.io/external-dns/plan"
 | 
			
		||||
	"sigs.k8s.io/external-dns/provider"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
const (
 | 
			
		||||
	CreateAction = "c"
 | 
			
		||||
	DeleteAction = "d"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
type PluralProvider struct {
 | 
			
		||||
	provider.BaseProvider
 | 
			
		||||
	Client *Client
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
type RecordChange struct {
 | 
			
		||||
	Action string
 | 
			
		||||
	Record *DnsRecord
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func NewPluralProvider(cluster, provider string) (*PluralProvider, error) {
 | 
			
		||||
	token := os.Getenv("PLURAL_ACCESS_TOKEN")
 | 
			
		||||
	endpoint := os.Getenv("PLURAL_ENDPOINT")
 | 
			
		||||
 | 
			
		||||
	if token == "" {
 | 
			
		||||
		return nil, fmt.Errorf("No plural access token provided, you must set the PLURAL_ACCESS_TOKEN env var")
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	config := &Config{
 | 
			
		||||
		Token:    token,
 | 
			
		||||
		Endpoint: endpoint,
 | 
			
		||||
		Cluster:  cluster,
 | 
			
		||||
		Provider: provider,
 | 
			
		||||
	}
 | 
			
		||||
	prov := &PluralProvider{
 | 
			
		||||
		Client: NewClient(config),
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return prov, nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (p *PluralProvider) Records(ctx context.Context) (endpoints []*endpoint.Endpoint, err error) {
 | 
			
		||||
	records, err := p.Client.DnsRecords()
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	endpoints = make([]*endpoint.Endpoint, len(records))
 | 
			
		||||
	for i, record := range records {
 | 
			
		||||
		endpoints[i] = endpoint.NewEndpoint(record.Name, record.Type, record.Records...)
 | 
			
		||||
	}
 | 
			
		||||
	return
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (p *PluralProvider) PropertyValuesEqual(name, previous, current string) bool {
 | 
			
		||||
	return p.BaseProvider.PropertyValuesEqual(name, previous, current)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (p *PluralProvider) AdjustEndpoints(endpoints []*endpoint.Endpoint) []*endpoint.Endpoint {
 | 
			
		||||
	return endpoints
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (p *PluralProvider) ApplyChanges(ctx context.Context, diffs *plan.Changes) error {
 | 
			
		||||
	changes := []*RecordChange{}
 | 
			
		||||
	for _, endpoint := range diffs.Create {
 | 
			
		||||
		changes = append(changes, makeChange(CreateAction, endpoint.Targets, endpoint))
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	for _, desired := range diffs.UpdateNew {
 | 
			
		||||
		changes = append(changes, makeChange(CreateAction, desired.Targets, desired))
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	for _, deleted := range diffs.Delete {
 | 
			
		||||
		changes = append(changes, makeChange(DeleteAction, []string{}, deleted))
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return p.applyChanges(changes)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func makeChange(change string, target []string, endpoint *endpoint.Endpoint) *RecordChange {
 | 
			
		||||
	return &RecordChange{
 | 
			
		||||
		Action: change,
 | 
			
		||||
		Record: &DnsRecord{
 | 
			
		||||
			Name:    endpoint.DNSName,
 | 
			
		||||
			Type:    endpoint.RecordType,
 | 
			
		||||
			Records: target,
 | 
			
		||||
		},
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (p *PluralProvider) applyChanges(changes []*RecordChange) error {
 | 
			
		||||
	for _, change := range changes {
 | 
			
		||||
		logFields := log.Fields{
 | 
			
		||||
			"name":   change.Record.Name,
 | 
			
		||||
			"type":   change.Record.Type,
 | 
			
		||||
			"action": change.Action,
 | 
			
		||||
		}
 | 
			
		||||
		log.WithFields(logFields).Info("Changing record.")
 | 
			
		||||
 | 
			
		||||
		if change.Action == CreateAction {
 | 
			
		||||
			_, err := p.Client.CreateRecord(change.Record)
 | 
			
		||||
			if err != nil {
 | 
			
		||||
				return err
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
		if change.Action == DeleteAction {
 | 
			
		||||
			if err := p.Client.DeleteRecord(change.Record.Name, change.Record.Type); err != nil {
 | 
			
		||||
				return err
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user