-
Notifications
You must be signed in to change notification settings - Fork 3
/
postgresql_shared.go
205 lines (151 loc) · 5.78 KB
/
postgresql_shared.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
package handler
import (
"database/sql"
"fmt"
_ "github.com/lib/pq"
"github.com/pivotal-cf/brokerapi"
"strings"
)
var postgresUrl string
var postgresUser string
var postgresAdminPassword string
type Postgresql_sharedHandler struct{}
func (handler *Postgresql_sharedHandler) DoProvision(instanceID string, details brokerapi.ProvisionDetails, asyncAllowed bool) (brokerapi.ProvisionedServiceSpec, ServiceInfo, error) {
//初始化postgres的链接串
db, err := sql.Open("postgres", "postgres://"+postgresUser+":"+postgresAdminPassword+"@"+postgresUrl+"?sslmode=disable")
if err != nil {
return brokerapi.ProvisionedServiceSpec{}, ServiceInfo{}, err
}
//测试是否能联通
err = db.Ping()
if err != nil {
return brokerapi.ProvisionedServiceSpec{}, ServiceInfo{}, err
}
defer db.Close()
//不能以instancdID为数据库名字,需要创建一个不带-的数据库名 pg似乎必须用字母开头的变量
dbname := "d" + getguid()
newusername := "u" + getguid()
newpassword := "p" + getguid()
fmt.Println("CREATE USER " + newusername + " WITH PASSWORD '" + newpassword + "'")
_, err = db.Query("CREATE USER " + newusername + " WITH PASSWORD '" + newpassword + "'")
if err != nil {
return brokerapi.ProvisionedServiceSpec{}, ServiceInfo{}, err
}
fmt.Println("CREATE DATABASE " + dbname + " WITH OWNER =" + newusername + " ENCODING = 'UTF8'")
_, err = db.Query("CREATE DATABASE " + dbname + " WITH OWNER =" + newusername + " ENCODING = 'UTF8'")
if err != nil {
return brokerapi.ProvisionedServiceSpec{}, ServiceInfo{}, err
}
_, err = db.Query("GRANT ALL PRIVILEGES ON DATABASE " + dbname + " TO " + newusername)
if err != nil {
return brokerapi.ProvisionedServiceSpec{}, ServiceInfo{}, err
}
//为dashbord赋值 todo dashboard应该提供一个界面才对
DashboardURL := "http://" + strings.Split(mysqlUrl, ":")[0] + ":9090?db=" + dbname + "&user=" + newusername + "&pass=" + newpassword
//赋值隐藏属性
myServiceInfo := ServiceInfo{
Url: postgresUrl,
Admin_user: postgresUser,
Admin_password: postgresAdminPassword,
Database: dbname,
User: newusername,
Password: newpassword,
}
provsiondetail := brokerapi.ProvisionedServiceSpec{DashboardURL: DashboardURL, IsAsync: false}
return provsiondetail, myServiceInfo, nil
}
func (handler *Postgresql_sharedHandler) DoLastOperation(myServiceInfo *ServiceInfo) (brokerapi.LastOperation, error) {
//因为是同步模式,协议里面并没有说怎么处理啊,统一反馈成功吧!
return brokerapi.LastOperation{
State: brokerapi.Succeeded,
Description: "It's a sync method!",
}, nil
}
func (handler *Postgresql_sharedHandler) DoDeprovision(myServiceInfo *ServiceInfo, asyncAllowed bool) (brokerapi.IsAsync, error) {
//初始化postgres的链接串
db, err := sql.Open("postgres", "postgres://"+postgresUser+":"+postgresAdminPassword+"@"+postgresUrl+"?sslmode=disable")
if err != nil {
return brokerapi.IsAsync(false), err
}
//测试是否能联通
err = db.Ping()
if err != nil {
return brokerapi.IsAsync(false), err
}
defer db.Close()
//删除数据库
_, err = db.Query("DROP DATABASE " + myServiceInfo.Database)
if err != nil {
return brokerapi.IsAsync(false), err
}
//删除用户
_, err = db.Query("DROP USER " + myServiceInfo.User)
if err != nil {
return brokerapi.IsAsync(false), err
}
//非异步,无错误的返回
return brokerapi.IsAsync(false), nil
}
func (handler *Postgresql_sharedHandler) DoBind(myServiceInfo *ServiceInfo, bindingID string, details brokerapi.BindDetails) (brokerapi.Binding, Credentials, error) {
//初始化postgres的链接串
db, err := sql.Open("postgres", "postgres://"+postgresUser+":"+postgresAdminPassword+"@"+postgresUrl+"?sslmode=disable")
if err != nil {
return brokerapi.Binding{}, Credentials{}, err
}
//测试是否能联通
err = db.Ping()
if err != nil {
return brokerapi.Binding{}, Credentials{}, err
}
defer db.Close()
newusername := "u" + getguid()
newpassword := "p" + getguid()
_, err = db.Query("CREATE USER " + newusername + " WITH PASSWORD '" + newpassword + "'")
if err != nil {
return brokerapi.Binding{}, Credentials{}, err
}
_, err = db.Query("GRANT ALL PRIVILEGES ON DATABASE " + myServiceInfo.Database + " TO " + newusername)
if err != nil {
return brokerapi.Binding{}, Credentials{}, err
}
mycredentials := Credentials{
Uri: "postgres://" + newusername + ":" + newpassword + "@" + myServiceInfo.Url + "/" + myServiceInfo.Database,
Hostname: strings.Split(myServiceInfo.Url, ":")[0],
Port: strings.Split(myServiceInfo.Url, ":")[1],
Username: newusername,
Password: newpassword,
Name: myServiceInfo.Database,
}
myBinding := brokerapi.Binding{Credentials: mycredentials}
return myBinding, mycredentials, nil
}
func (handler *Postgresql_sharedHandler) DoUnbind(myServiceInfo *ServiceInfo, mycredentials *Credentials) error {
//初始化postgres的链接串
db, err := sql.Open("postgres", "postgres://"+postgresUser+":"+postgresAdminPassword+"@"+postgresUrl+"?sslmode=disable")
if err != nil {
return err
}
//测试是否能联通
err = db.Ping()
if err != nil {
return err
}
defer db.Close()
//要先取消授权才能删除
_, err = db.Query("REVOKE ALL ON DATABASE " + myServiceInfo.Database + " FROM " + mycredentials.Username)
if err != nil {
return err
}
//删除用户
_, err = db.Query("DROP USER " + mycredentials.Username)
if err != nil {
return err
}
return nil
}
func init() {
register("postgresql_shared", &Postgresql_sharedHandler{})
postgresUrl = getenv("POSTGRESURL") //共享实例的地址
postgresUser = getenv("POSTGRESUSER") //共享实例的mongodb地址
postgresAdminPassword = getenv("POSTGRESADMINPASSWORD") //共享实例和独立实例的管理员密码
}