@@ -19,8 +19,10 @@ package openstack
1919import (
2020 "os"
2121
22+ "github.com/golang/glog"
2223 "github.com/gophercloud/gophercloud"
2324 "github.com/gophercloud/gophercloud/openstack"
25+ "gopkg.in/gcfg.v1"
2426)
2527
2628type IOpenStack interface {
@@ -38,15 +40,93 @@ type OpenStack struct {
3840 blockstorage * gophercloud.ServiceClient
3941}
4042
43+ type Config struct {
44+ Global struct {
45+ AuthUrl string `gcfg:"auth-url"`
46+ Username string
47+ UserId string `gcfg:"user-id"`
48+ Password string
49+ TenantId string `gcfg:"tenant-id"`
50+ TenantName string `gcfg:"tenant-name"`
51+ DomainId string `gcfg:"domain-id"`
52+ DomainName string `gcfg:"domain-name"`
53+ Region string
54+ }
55+ }
56+
57+ func (cfg Config ) toAuthOptions () gophercloud.AuthOptions {
58+ return gophercloud.AuthOptions {
59+ IdentityEndpoint : cfg .Global .AuthUrl ,
60+ Username : cfg .Global .Username ,
61+ UserID : cfg .Global .UserId ,
62+ Password : cfg .Global .Password ,
63+ TenantID : cfg .Global .TenantId ,
64+ TenantName : cfg .Global .TenantName ,
65+ DomainID : cfg .Global .DomainId ,
66+ DomainName : cfg .Global .DomainName ,
67+
68+ // Persistent service, so we need to be able to renew tokens.
69+ AllowReauth : true ,
70+ }
71+ }
72+
73+ func getConfigFromFile (configFilePath string ) (gophercloud.AuthOptions , string , error ) {
74+ // Get config from file
75+ var opts gophercloud.AuthOptions
76+ config , err := os .Open (configFilePath )
77+ if err != nil {
78+ glog .V (3 ).Infof ("Failed to open OpenStack configuration file: %v" , err )
79+ return opts , "" , err
80+ }
81+ defer config .Close ()
82+
83+ // Read configuration
84+ var cfg Config
85+ err = gcfg .ReadInto (& cfg , config )
86+ if err != nil {
87+ glog .V (3 ).Infof ("Failed to read OpenStack configuration file: %v" , err )
88+ return opts , "" , err
89+ }
90+
91+ opts = cfg .toAuthOptions ()
92+ region := cfg .Global .Region
93+
94+ return opts , region , nil
95+ }
96+
97+ func getConfigFromEnv () (gophercloud.AuthOptions , string , error ) {
98+ // Get config from env
99+ opts , err := openstack .AuthOptionsFromEnv ()
100+ if err != nil {
101+ glog .V (3 ).Infof ("Failed to read OpenStack configuration from env: %v" , err )
102+ return opts , "" , err
103+ }
104+
105+ // Get Region from env
106+ region := os .Getenv ("OS_REGION_NAME" )
107+
108+ return opts , region , nil
109+ }
110+
41111var OsInstance IOpenStack = nil
112+ var configFile string = "/etc/openstack.conf"
113+
114+ func InitOpenStackProvider (cfg string ) {
115+ configFile = cfg
116+ glog .V (2 ).Infof ("InitOpenStackProvider configFile: %s" , configFile )
117+ }
42118
43119func GetOpenStackProvider () (IOpenStack , error ) {
44120
45121 if OsInstance == nil {
46- // Get config from env
47- opts , err := openstack . AuthOptionsFromEnv ( )
122+ // Get config from file
123+ opts , region , err := getConfigFromFile ( configFile )
48124 if err != nil {
49- return nil , err
125+ // Get config from env
126+ opts , region , err = getConfigFromEnv ()
127+ if err != nil {
128+ return nil , err
129+ }
50130 }
51131
52132 // Authenticate Client
@@ -55,8 +135,6 @@ func GetOpenStackProvider() (IOpenStack, error) {
55135 return nil , err
56136 }
57137
58- region := os .Getenv ("OS_REGION_NAME" )
59-
60138 // Init Nova ServiceClient
61139 computeclient , err := openstack .NewComputeV2 (provider , gophercloud.EndpointOpts {
62140 Region : region ,
0 commit comments