@@ -16,11 +16,16 @@ package mockprivilegedaccessmanager
16
16
17
17
import (
18
18
"context"
19
+ "crypto/md5"
20
+ "encoding/base64"
21
+ "fmt"
22
+ "time"
19
23
20
24
"google.golang.org/genproto/googleapis/longrunning"
21
25
"google.golang.org/grpc/codes"
22
26
"google.golang.org/grpc/status"
23
27
"google.golang.org/protobuf/proto"
28
+ "google.golang.org/protobuf/types/known/timestamppb"
24
29
25
30
pb "github.com/GoogleCloudPlatform/k8s-config-connector/mockgcp/generated/mockgcp/cloud/privilegedaccessmanager/v1"
26
31
)
@@ -40,6 +45,9 @@ func (s *PrivilegedAccessManager) GetEntitlement(ctx context.Context, req *pb.Ge
40
45
41
46
obj := & pb.Entitlement {}
42
47
if err := s .storage .Get (ctx , fqn , obj ); err != nil {
48
+ if status .Code (err ) == codes .NotFound {
49
+ return nil , status .Errorf (codes .NotFound , "Resource '%s' was not found" , fqn )
50
+ }
43
51
return nil , err
44
52
}
45
53
@@ -53,16 +61,25 @@ func (s *PrivilegedAccessManager) CreateEntitlement(ctx context.Context, req *pb
53
61
return nil , err
54
62
}
55
63
64
+ now := timestamppb .New (time .Now ())
56
65
fqn := name .String ()
57
66
58
67
obj := proto .Clone (req .Entitlement ).(* pb.Entitlement )
59
68
obj .Name = fqn
60
-
69
+ obj .CreateTime = now
70
+ obj .UpdateTime = now
71
+ obj .Etag = computeEtag (obj )
72
+ obj .State = pb .Entitlement_AVAILABLE
61
73
if err := s .storage .Create (ctx , fqn , obj ); err != nil {
62
74
return nil , err
63
75
}
64
76
65
- return s .operations .NewLRO (ctx )
77
+ metadata := constructOperationMetadata (fqn , "create" )
78
+ return s .operations .StartLRO (ctx , name .parent (), metadata , func () (proto.Message , error ) {
79
+ result := proto .Clone (obj ).(* pb.Entitlement )
80
+ metadata .EndTime = now
81
+ return result , nil
82
+ })
66
83
}
67
84
68
85
func (s * PrivilegedAccessManager ) UpdateEntitlement (ctx context.Context , req * pb.UpdateEntitlementRequest ) (* longrunning.Operation , error ) {
@@ -82,7 +99,6 @@ func (s *PrivilegedAccessManager) UpdateEntitlement(ctx context.Context, req *pb
82
99
// Required. A list of fields to be updated in this request.
83
100
paths := req .GetUpdateMask ().GetPaths ()
84
101
85
- // TODO: Some sort of helper for fieldmask?
86
102
for _ , path := range paths {
87
103
switch path {
88
104
case "eligibleUsers" :
@@ -106,7 +122,13 @@ func (s *PrivilegedAccessManager) UpdateEntitlement(ctx context.Context, req *pb
106
122
return nil , err
107
123
}
108
124
109
- return s .operations .NewLRO (ctx )
125
+ metadata := constructOperationMetadata (fqn , "update" )
126
+ return s .operations .StartLRO (ctx , name .parent (), metadata , func () (proto.Message , error ) {
127
+ result := proto .Clone (obj ).(* pb.Entitlement )
128
+ now := timestamppb .New (time .Now ())
129
+ metadata .EndTime = now
130
+ return result , nil
131
+ })
110
132
}
111
133
112
134
func (s * PrivilegedAccessManager ) DeleteEntitlement (ctx context.Context , req * pb.DeleteEntitlementRequest ) (* longrunning.Operation , error ) {
@@ -121,6 +143,33 @@ func (s *PrivilegedAccessManager) DeleteEntitlement(ctx context.Context, req *pb
121
143
if err := s .storage .Delete (ctx , fqn , oldObj ); err != nil {
122
144
return nil , err
123
145
}
146
+ metadata := constructOperationMetadata (fqn , "delete" )
147
+ return s .operations .StartLRO (ctx , name .parent (), metadata , func () (proto.Message , error ) {
148
+ result := proto .Clone (oldObj ).(* pb.Entitlement )
149
+ result .State = pb .Entitlement_DELETED
150
+ result .Name = "projects/${projectNumber}/locations/global/entitlements/privilegedaccessmanagerentitlement-${uniqueId}"
151
+ now := timestamppb .New (time .Now ())
152
+ metadata .EndTime = now
153
+ return result , nil
154
+ })
155
+ }
156
+
157
+ func computeEtag (obj proto.Message ) string {
158
+ b , err := proto .Marshal (obj )
159
+ if err != nil {
160
+ panic (fmt .Sprintf ("converting to proto: %v" , err ))
161
+ }
162
+ hash := md5 .Sum (b )
163
+ return base64 .URLEncoding .EncodeToString (hash [:])
164
+ }
124
165
125
- return s .operations .NewLRO (ctx )
166
+ func constructOperationMetadata (target , verb string ) * pb.OperationMetadata {
167
+ now := timestamppb .New (time .Now ())
168
+ return & pb.OperationMetadata {
169
+ Target : target ,
170
+ CreateTime : now ,
171
+ ApiVersion : "v1" ,
172
+ RequestedCancellation : false ,
173
+ Verb : verb ,
174
+ }
126
175
}
0 commit comments