@@ -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,37 +40,114 @@ 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 , gophercloud.EndpointOpts , error ) {
74+ // Get config from file
75+ var authOpts gophercloud.AuthOptions
76+ var epOpts gophercloud.EndpointOpts
77+ config , err := os .Open (configFilePath )
78+ if err != nil {
79+ glog .V (3 ).Infof ("Failed to open OpenStack configuration file: %v" , err )
80+ return authOpts , epOpts , err
81+ }
82+ defer config .Close ()
83+
84+ // Read configuration
85+ var cfg Config
86+ err = gcfg .ReadInto (& cfg , config )
87+ if err != nil {
88+ glog .V (3 ).Infof ("Failed to read OpenStack configuration file: %v" , err )
89+ return authOpts , epOpts , err
90+ }
91+
92+ authOpts = cfg .toAuthOptions ()
93+ epOpts = gophercloud.EndpointOpts {
94+ Region : cfg .Global .Region ,
95+ }
96+
97+ return authOpts , epOpts , nil
98+ }
99+
100+ func GetConfigFromEnv () (gophercloud.AuthOptions , gophercloud.EndpointOpts , error ) {
101+ // Get config from env
102+ authOpts , err := openstack .AuthOptionsFromEnv ()
103+ var epOpts gophercloud.EndpointOpts
104+ if err != nil {
105+ glog .V (3 ).Infof ("Failed to read OpenStack configuration from env: %v" , err )
106+ return authOpts , epOpts , err
107+ }
108+
109+ epOpts = gophercloud.EndpointOpts {
110+ Region : os .Getenv ("OS_REGION_NAME" ),
111+ }
112+
113+ return authOpts , epOpts , nil
114+ }
115+
41116var OsInstance IOpenStack = nil
117+ var configFile string = "/etc/cloud.conf"
118+
119+ func InitOpenStackProvider (cfg string ) {
120+ configFile = cfg
121+ glog .V (2 ).Infof ("InitOpenStackProvider configFile: %s" , configFile )
122+ }
42123
43124func GetOpenStackProvider () (IOpenStack , error ) {
44125
45126 if OsInstance == nil {
46- // Get config from env
47- opts , err := openstack . AuthOptionsFromEnv ( )
127+ // Get config from file
128+ authOpts , epOpts , err := GetConfigFromFile ( configFile )
48129 if err != nil {
49- return nil , err
130+ // Get config from env
131+ authOpts , epOpts , err = GetConfigFromEnv ()
132+ if err != nil {
133+ return nil , err
134+ }
50135 }
51136
52137 // Authenticate Client
53- provider , err := openstack .AuthenticatedClient (opts )
138+ provider , err := openstack .AuthenticatedClient (authOpts )
54139 if err != nil {
55140 return nil , err
56141 }
57142
58- region := os .Getenv ("OS_REGION_NAME" )
59-
60143 // Init Nova ServiceClient
61- computeclient , err := openstack .NewComputeV2 (provider , gophercloud.EndpointOpts {
62- Region : region ,
63- })
144+ computeclient , err := openstack .NewComputeV2 (provider , epOpts )
64145 if err != nil {
65146 return nil , err
66147 }
67148
68149 // Init Cinder ServiceClient
69- blockstorageclient , err := openstack .NewBlockStorageV3 (provider , gophercloud.EndpointOpts {
70- Region : region ,
71- })
150+ blockstorageclient , err := openstack .NewBlockStorageV3 (provider , epOpts )
72151 if err != nil {
73152 return nil , err
74153 }
0 commit comments