forked from openshift/origin
-
Notifications
You must be signed in to change notification settings - Fork 1
/
lastoperation.go
105 lines (88 loc) · 3.74 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
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
package servicebroker
import (
"errors"
"net/http"
"github.com/golang/glog"
authorizationv1 "k8s.io/api/authorization/v1"
kapiv1 "k8s.io/api/core/v1"
kerrors "k8s.io/apimachinery/pkg/api/errors"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apiserver/pkg/authentication/user"
templateapiv1 "github.com/openshift/api/template/v1"
templateapi "github.com/openshift/origin/pkg/template/apis/template"
"github.com/openshift/origin/pkg/templateservicebroker/openservicebroker/api"
"github.com/openshift/origin/pkg/templateservicebroker/util"
)
// LastOperation returns the status of an asynchronous operation. Currently
// the OSB API only supports async Provision and Deprovision.
func (b *Broker) LastOperation(u user.Info, instanceID string, operation api.Operation) *api.Response {
glog.V(4).Infof("Template service broker: LastOperation: instanceID %s", instanceID)
switch operation {
case api.OperationProvisioning:
return b.lastOperationProvisioning(u, instanceID)
case api.OperationDeprovisioning:
return b.lastOperationDeprovisioning(u, instanceID)
}
return api.BadRequest(errors.New("invalid operation"))
}
// lastOperationProvisioning returns the status of an asynchronous provision
// operation.
func (b *Broker) lastOperationProvisioning(u user.Info, instanceID string) *api.Response {
brokerTemplateInstance, err := b.templateclient.BrokerTemplateInstances().Get(instanceID, metav1.GetOptions{})
if err != nil {
if kerrors.IsNotFound(err) {
return api.BadRequest(err)
}
return api.InternalServerError(err)
}
namespace := brokerTemplateInstance.Spec.TemplateInstance.Namespace
if err := util.Authorize(b.kc.Authorization().SubjectAccessReviews(), u, &authorizationv1.ResourceAttributes{
Namespace: namespace,
Verb: "get",
Group: templateapi.GroupName,
Resource: "templateinstances",
Name: brokerTemplateInstance.Spec.TemplateInstance.Name,
}); err != nil {
return api.Forbidden(err)
}
templateInstance, err := b.templateclient.TemplateInstances(namespace).Get(brokerTemplateInstance.Spec.TemplateInstance.Name, metav1.GetOptions{})
if err != nil {
return api.InternalServerError(err)
}
state := api.LastOperationStateInProgress
var description string
for _, condition := range templateInstance.Status.Conditions {
if condition.Type == templateapiv1.TemplateInstanceReady && condition.Status == kapiv1.ConditionTrue {
state = api.LastOperationStateSucceeded
break
}
if condition.Type == templateapiv1.TemplateInstanceInstantiateFailure && condition.Status == kapiv1.ConditionTrue {
state = api.LastOperationStateFailed
description = condition.Message
break
}
}
return api.NewResponse(http.StatusOK, &api.LastOperationResponse{State: state, Description: description}, nil)
}
// lastOperationDerovisioning returns the status of an asynchronous deprovision
// operation.
func (b *Broker) lastOperationDeprovisioning(u user.Info, instanceID string) *api.Response {
brokerTemplateInstance, err := b.templateclient.BrokerTemplateInstances().Get(instanceID, metav1.GetOptions{})
if err != nil {
if kerrors.IsNotFound(err) {
return api.NewResponse(http.StatusOK, &api.LastOperationResponse{State: api.LastOperationStateSucceeded}, nil)
}
return api.InternalServerError(err)
}
namespace := brokerTemplateInstance.Spec.TemplateInstance.Namespace
if err := util.Authorize(b.kc.Authorization().SubjectAccessReviews(), u, &authorizationv1.ResourceAttributes{
Namespace: namespace,
Verb: "get",
Group: templateapi.GroupName,
Resource: "templateinstances",
Name: brokerTemplateInstance.Spec.TemplateInstance.Name,
}); err != nil {
return api.Forbidden(err)
}
return api.NewResponse(http.StatusOK, &api.LastOperationResponse{State: api.LastOperationStateInProgress}, nil)
}