-
Notifications
You must be signed in to change notification settings - Fork 12
/
deprovision.go
106 lines (88 loc) · 3.57 KB
/
deprovision.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
package queue
import (
"fmt"
"github.com/huaweicloud/golangsdk/openstack/dms/v1/queues"
"github.com/huaweicloud/huaweicloud-service-broker/pkg/database"
"github.com/huaweicloud/huaweicloud-service-broker/pkg/models"
"github.com/pivotal-cf/brokerapi"
)
// Deprovision implematation
func (b *DMSBroker) Deprovision(instanceID string, details brokerapi.DeprovisionDetails, asyncAllowed bool) (brokerapi.DeprovisionServiceSpec, error) {
// Check accepts_incomplete if this service support async
if models.OperationAsyncDMSQueue {
e := b.Catalog.ValidateAcceptsIncomplete(asyncAllowed)
if e != nil {
return brokerapi.DeprovisionServiceSpec{}, e
}
}
// Check dms instance length in back database
var length int
err := database.BackDBConnection.
Model(&database.InstanceDetails{}).
Where("instance_id = ? and service_id = ? and plan_id = ?", instanceID, details.ServiceID, details.PlanID).
Count(&length).Error
if err != nil {
return brokerapi.DeprovisionServiceSpec{}, fmt.Errorf("check dms instance length in back database failed. Error: %s", err)
}
// ErrInstanceDoesNotExist
if length == 0 {
return brokerapi.DeprovisionServiceSpec{}, brokerapi.ErrInstanceDoesNotExist
}
// get InstanceDetails in back database
ids := database.InstanceDetails{}
err = database.BackDBConnection.
Where("instance_id = ? and service_id = ? and plan_id = ?", instanceID, details.ServiceID, details.PlanID).
First(&ids).Error
if err != nil {
return brokerapi.DeprovisionServiceSpec{}, brokerapi.ErrInstanceDoesNotExist
}
// Log InstanceDetails
b.Logger.Debug(fmt.Sprintf("dms instance in back database: %v", models.ToJson(ids)))
// Init dms client
dmsClient, err := b.CloudCredentials.DMSV1Client()
if err != nil {
return brokerapi.DeprovisionServiceSpec{}, fmt.Errorf("create dms client failed. Error: %s", err)
}
// Log opts
b.Logger.Debug(fmt.Sprintf("deprovision dms queue opts: %s", instanceID))
// Invoke sdk
result := queues.Delete(dmsClient, ids.TargetID)
if result.Err != nil {
return brokerapi.DeprovisionServiceSpec{}, fmt.Errorf("deprovision dms instance failed. Error: %s", result.Err)
}
// Delete InstanceDetails in back database
err = database.BackDBConnection.Delete(&ids).Error
if err != nil {
return brokerapi.DeprovisionServiceSpec{}, fmt.Errorf("delete dms instance in back database failed. Error: %s", err)
}
// Log result
b.Logger.Debug(fmt.Sprintf("deprovision dms instance success: %s", instanceID))
// Return result
if asyncAllowed && models.OperationAsyncDMSQueue {
// OperationDatas for OperationDeprovisioning
ods := database.OperationDetails{
OperationType: models.OperationDeprovisioning,
ServiceID: details.ServiceID,
PlanID: details.PlanID,
InstanceID: instanceID,
TargetID: ids.TargetID,
TargetName: ids.TargetName,
TargetStatus: ids.TargetStatus,
TargetInfo: ids.TargetInfo,
AdditionalInfo: ids.AdditionalInfo,
}
operationdata, err := ods.ToString()
if err != nil {
return brokerapi.DeprovisionServiceSpec{}, fmt.Errorf("convert dms instance operation datas failed. Error: %s", err)
}
// log OperationDatas
b.Logger.Debug(fmt.Sprintf("create dms instance operation datas: %s", operationdata))
// Create OperationDetails
err = database.BackDBConnection.Create(&ods).Error
if err != nil {
return brokerapi.DeprovisionServiceSpec{}, fmt.Errorf("create operation in back database failed. Error: %s", err)
}
return brokerapi.DeprovisionServiceSpec{IsAsync: true, OperationData: ""}, nil
}
return brokerapi.DeprovisionServiceSpec{IsAsync: false, OperationData: ""}, nil
}