Skip to content

Commit e1536ac

Browse files
authored
Merge pull request #19 from inovex/cloudsYAML
feat: switch to config via clouds.yaml to allow e.g. application-credentials
2 parents fb1015d + 6b9bad8 commit e1536ac

File tree

5 files changed

+35
-79
lines changed

5 files changed

+35
-79
lines changed

.github/workflows/devstack.yml

+3-6
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,9 @@ name: devstack
22
on:
33
pull_request:
44

5+
env:
6+
OS_CLOUD: devstack-admin-demo
7+
58
jobs:
69
external-dns-source-fake:
710
runs-on: ubuntu-22.04
@@ -74,17 +77,14 @@ jobs:
7477

7578
- name: Create zones example.com
7679
run: |
77-
source ./devstack/openrc
7880
openstack zone create --email [email protected] example.com.
7981
8082
- name: Wait for zone creation
8183
run: |
82-
source ./devstack/openrc
8384
while [ "$(openstack zone list -f csv | grep PENDING)" != "" ]; do date; openstack zone list -f value; sleep 1; done
8485
8586
- name: Start external-dns-openstack-webhook in background
8687
run: |
87-
source ./devstack/openrc
8888
./build/bin/external-dns-openstack-webhook >/tmp/external-dns-openstack-webhook.log 2>&1 &
8989
9090
- name: Run external-dns
@@ -96,19 +96,16 @@ jobs:
9696

9797
- name: Wait for PENDING
9898
run: |
99-
source ./devstack/openrc
10099
while [ "$(openstack zone list -f csv | grep PENDING)" != "" ]; do date; openstack zone list -f value; sleep 1; done
101100
102101
- name: Show created entries
103102
run: |
104-
source ./devstack/openrc
105103
echo "Zones:"
106104
openstack zone list -f value
107105
echo "Recordsets:"
108106
openstack recordset list all -f value
109107
110108
- name: Check created entries
111109
run: |
112-
source ./devstack/openrc
113110
if [ $(openstack recordset list all -f value | grep -c " TXT ") -ne 20 ]; then exit 1; fi
114111
if [ $(openstack recordset list all -f value | grep -c " A ") -ne 10 ]; then exit 2; fi

go.mod

+1
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ require (
3737
golang.org/x/text v0.21.0 // indirect
3838
google.golang.org/protobuf v1.35.2 // indirect
3939
gopkg.in/inf.v0 v0.9.1 // indirect
40+
gopkg.in/yaml.v2 v2.4.0 // indirect
4041
k8s.io/apimachinery v0.32.0 // indirect
4142
k8s.io/klog/v2 v2.130.1 // indirect
4243
k8s.io/utils v0.0.0-20241104100929-3ea5e8cea738 // indirect

go.sum

+2
Original file line numberDiff line numberDiff line change
@@ -109,6 +109,8 @@ gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntN
109109
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=
110110
gopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc=
111111
gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw=
112+
gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY=
113+
gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=
112114
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
113115
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
114116
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=

internal/designate/client/client.go

+9-68
Original file line numberDiff line numberDiff line change
@@ -19,19 +19,15 @@ package client
1919

2020
import (
2121
"context"
22-
"net"
23-
"net/http"
24-
"os"
25-
"time"
2622

2723
"github.com/gophercloud/gophercloud/v2"
2824
"github.com/gophercloud/gophercloud/v2/openstack"
25+
"github.com/gophercloud/gophercloud/v2/openstack/config"
26+
"github.com/gophercloud/gophercloud/v2/openstack/config/clouds"
2927
"github.com/gophercloud/gophercloud/v2/openstack/dns/v2/recordsets"
3028
"github.com/gophercloud/gophercloud/v2/openstack/dns/v2/zones"
3129
"github.com/gophercloud/gophercloud/v2/pagination"
3230
log "github.com/sirupsen/logrus"
33-
34-
"sigs.k8s.io/external-dns/pkg/tlsutils"
3531
)
3632

3733
// interface between provider and OpenStack DNS API
@@ -66,81 +62,26 @@ func NewDesignateClient() (DesignateClientInterface, error) {
6662
return &designateClient{serviceClient}, nil
6763
}
6864

69-
// copies environment variables to new names without overwriting existing values
70-
func remapEnv(mapping map[string]string) {
71-
for k, v := range mapping {
72-
currentVal := os.Getenv(k)
73-
newVal := os.Getenv(v)
74-
if currentVal == "" && newVal != "" {
75-
os.Setenv(k, newVal)
76-
}
77-
}
78-
}
79-
80-
// returns OpenStack Keystone authentication settings by obtaining values from standard environment variables.
81-
// also fixes incompatibilities between gophercloud implementation and *-stackrc files that can be downloaded
82-
// from OpenStack dashboard in latest versions
83-
func getAuthSettings() (gophercloud.AuthOptions, error) {
84-
remapEnv(map[string]string{
85-
"OS_TENANT_NAME": "OS_PROJECT_NAME",
86-
"OS_TENANT_ID": "OS_PROJECT_ID",
87-
"OS_DOMAIN_NAME": "OS_USER_DOMAIN_NAME",
88-
"OS_DOMAIN_ID": "OS_USER_DOMAIN_ID",
89-
})
90-
91-
opts, err := openstack.AuthOptionsFromEnv()
92-
if err != nil {
93-
return gophercloud.AuthOptions{}, err
94-
}
95-
opts.AllowReauth = true
96-
return opts, nil
97-
}
98-
9965
// authenticate in OpenStack and obtain Designate service endpoint
10066
func createDesignateServiceClient() (*gophercloud.ServiceClient, error) {
101-
opts, err := getAuthSettings()
102-
if err != nil {
103-
return nil, err
104-
}
105-
log.Infof("Using OpenStack Keystone at %s", opts.IdentityEndpoint)
106-
authProvider, err := openstack.NewClient(opts.IdentityEndpoint)
107-
if err != nil {
108-
return nil, err
109-
}
67+
ctx := context.Background()
11068

111-
tlsConfig, err := tlsutils.CreateTLSConfig("OPENSTACK")
69+
authOptions, endpointOptions, tlsConfig, err := clouds.Parse()
11270
if err != nil {
11371
return nil, err
11472
}
11573

116-
transport := &http.Transport{
117-
Proxy: http.ProxyFromEnvironment,
118-
DialContext: (&net.Dialer{
119-
Timeout: 30 * time.Second,
120-
KeepAlive: 30 * time.Second,
121-
}).DialContext,
122-
MaxIdleConns: 100,
123-
IdleConnTimeout: 90 * time.Second,
124-
TLSHandshakeTimeout: 10 * time.Second,
125-
ExpectContinueTimeout: 1 * time.Second,
126-
TLSClientConfig: tlsConfig,
127-
}
128-
authProvider.HTTPClient.Transport = transport
129-
130-
ctx := context.Background()
131-
if err = openstack.Authenticate(ctx, authProvider, opts); err != nil {
74+
providerClient, err := config.NewProviderClient(ctx, authOptions, config.WithTLSConfig(tlsConfig))
75+
if err != nil {
13276
return nil, err
13377
}
78+
log.Infof("Using OpenStack Keystone at %s", providerClient.IdentityEndpoint)
13479

135-
eo := gophercloud.EndpointOpts{
136-
Region: os.Getenv("OS_REGION_NAME"),
137-
}
138-
139-
client, err := openstack.NewDNSV2(authProvider, eo)
80+
client, err := openstack.NewDNSV2(providerClient, endpointOptions)
14081
if err != nil {
14182
return nil, err
14283
}
143-
log.Infof("Found OpenStack Designate service at %s", client.Endpoint)
84+
log.Infof("Found OpenStack Designate (DNS) service at %s", client.Endpoint)
14485
return client, nil
14586
}
14687

internal/designate/provider/provider_test.go

+20-5
Original file line numberDiff line numberDiff line change
@@ -185,11 +185,26 @@ func TestNewDesignateProvider(t *testing.T) {
185185
t.Fatal(err)
186186
}
187187

188-
os.Setenv("OS_AUTH_URL", ts.URL+"/v3")
189-
os.Setenv("OS_USERNAME", "username")
190-
os.Setenv("OS_PASSWORD", "password")
191-
os.Setenv("OS_USER_DOMAIN_NAME", "Default")
192-
os.Setenv("OPENSTACK_CA_FILE", tmpfile.Name())
188+
tmpcloudsyaml, err := os.CreateTemp("", "clouds.yaml")
189+
if err != nil {
190+
t.Fatal(err)
191+
}
192+
defer os.Remove(tmpcloudsyaml.Name())
193+
194+
tmpcloudsyaml.WriteString(fmt.Sprintf(`
195+
clouds:
196+
unittest:
197+
auth:
198+
auth_url: %s/v3
199+
application_credential_id: fakefake
200+
application_credential_secret: fakefake
201+
region_name: RegionOne
202+
interface: public
203+
auth_type: v3applicationcredential`, ts.URL))
204+
205+
os.Setenv("OS_CLIENT_CONFIG_FILE", tmpcloudsyaml.Name())
206+
os.Setenv("OS_CLOUD", "unittest")
207+
os.Setenv("OS_CACERT", tmpfile.Name())
193208

194209
if _, err := NewDesignateProvider(endpoint.DomainFilter{}, true); err != nil {
195210
t.Fatalf("Failed to initialize Designate provider: %s", err)

0 commit comments

Comments
 (0)