-
Notifications
You must be signed in to change notification settings - Fork 12
/
lastoperation.go
87 lines (79 loc) · 2.88 KB
/
lastoperation.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
package rds
import (
"fmt"
"github.com/huaweicloud/golangsdk"
"github.com/huaweicloud/golangsdk/openstack/rds/v1/instances"
"github.com/huaweicloud/huaweicloud-service-broker/pkg/database"
"github.com/huaweicloud/huaweicloud-service-broker/pkg/models"
"github.com/pivotal-cf/brokerapi"
)
// LastOperation implematation
func (b *RDSBroker) LastOperation(instanceID string, operationData database.OperationDetails) (brokerapi.LastOperation, error) {
// Log opts
b.Logger.Debug(fmt.Sprintf("lastoperation rds instance opts: instanceID: %s operationData: %v", instanceID, models.ToJson(operationData)))
// Handle different cases
if (operationData.OperationType == models.OperationProvisioning) ||
(operationData.OperationType == models.OperationUpdating) {
// OperationProvisioning || OperationUpdating
instance, err, serviceErr := SyncStatusWithService(b, instanceID, operationData.ServiceID,
operationData.PlanID, operationData.TargetID)
if err != nil {
return brokerapi.LastOperation{}, err
}
if serviceErr != nil {
return brokerapi.LastOperation{
State: brokerapi.Failed,
Description: fmt.Sprintf("get rds instance failed. Error: %s", serviceErr),
}, nil
}
// Status
if instance.Status == "ACTIVE" {
return brokerapi.LastOperation{
State: brokerapi.Succeeded,
Description: fmt.Sprintf("Status: %s", instance.Status),
}, nil
} else if instance.Status == "FAILED" {
return brokerapi.LastOperation{
State: brokerapi.Failed,
Description: fmt.Sprintf("Status: %s", instance.Status),
}, nil
} else {
return brokerapi.LastOperation{
State: brokerapi.InProgress,
Description: fmt.Sprintf("Status: %s", instance.Status),
}, nil
}
} else if operationData.OperationType == models.OperationDeprovisioning {
// OperationDeprovisioning
rdsClient, err := b.CloudCredentials.RDSV1Client()
if err != nil {
return brokerapi.LastOperation{}, fmt.Errorf("create rds client failed. Error: %s", err)
}
// Invoke sdk get
instance, serviceErr := instances.Get(rdsClient, operationData.TargetID).Extract()
if serviceErr != nil {
e, ok := serviceErr.(golangsdk.ErrDefault404)
if ok {
return brokerapi.LastOperation{
State: brokerapi.Succeeded,
Description: fmt.Sprintf("Status: %s", e.Error()),
}, nil
} else {
return brokerapi.LastOperation{
State: brokerapi.Failed,
Description: fmt.Sprintf("get rds instance failed. Error: %s", serviceErr),
}, nil
}
} else {
return brokerapi.LastOperation{
State: brokerapi.InProgress,
Description: fmt.Sprintf("Status: %s", instance.Status),
}, nil
}
} else {
b.Logger.Debug(fmt.Sprintf("unknown operation data type: %s", operationData.OperationType))
}
// Log result
b.Logger.Debug(fmt.Sprintf("lastoperation rds instance success: instanceID: %s", instanceID))
return brokerapi.LastOperation{}, nil
}