Skip to content
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.

Commit d1fbf37

Browse files
author
Vivek Singh
authoredJun 8, 2020
[infra-proxy-service] Add Data bag item update API (#3871)
1 parent 9ea0314 commit d1fbf37

File tree

20 files changed

+1272
-267
lines changed

20 files changed

+1272
-267
lines changed
 

‎api/external/infra_proxy/infra_proxy.pb.go

+142-104
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

‎api/external/infra_proxy/infra_proxy.pb.gw.go

+180
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

‎api/external/infra_proxy/infra_proxy.pb.policy.go

+19-2
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

‎api/external/infra_proxy/infra_proxy.proto

+6
Original file line numberDiff line numberDiff line change
@@ -184,6 +184,12 @@ service InfraProxy {
184184
option (chef.automate.api.iam.policy).resource = "infra:infraServers:{server_id}:orgs:{org_id}:data_bags";
185185
option (chef.automate.api.iam.policy).action = "infra:infraServers:update";
186186
};
187+
rpc UpdateDataBagItem (infra_proxy.request.UpdateDataBagItem) returns (infra_proxy.response.UpdateDataBagItem) {
188+
option (google.api.http).put = "/api/v0/infra/servers/{server_id}/orgs/{org_id}/data_bags/{name}/{item_id}";
189+
option (google.api.http).body = "*";
190+
option (chef.automate.api.iam.policy).resource = "infra:infraServers:{server_id}:orgs:{org_id}:data_bags";
191+
option (chef.automate.api.iam.policy).action = "infra:infraServers:update";
192+
};
187193

188194
rpc GetEnvironments (infra_proxy.request.Environments) returns (infra_proxy.response.Environments) {
189195
option (google.api.http).get = "/api/v0/infra/servers/{server_id}/orgs/{org_id}/environments";

‎api/external/infra_proxy/infra_proxy.swagger.json

+102-2
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

‎api/external/infra_proxy/request/databags.pb.go

+105-22
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

‎api/external/infra_proxy/request/databags.proto

+17-2
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@ syntax = "proto3";
33
package chef.automate.api.infra_proxy.request;
44
option go_package = "github.com/chef/automate/api/external/infra_proxy/request";
55

6+
import "google/protobuf/struct.proto";
7+
68
message DataBags {
79
// Chef organization ID.
810
string org_id = 1;
@@ -39,6 +41,19 @@ message CreateDataBagItem {
3941
string server_id = 2;
4042
// Data bag name.
4143
string name = 3;
42-
// Data bag item stringify data.
43-
string data = 4;
44+
// Data bag item JSON data.
45+
google.protobuf.Struct data = 4;
46+
}
47+
48+
message UpdateDataBagItem {
49+
// Chef organization ID.
50+
string org_id = 1;
51+
// Chef Infra Server ID.
52+
string server_id = 2;
53+
// Data bag name.
54+
string name = 3;
55+
// Data bag item ID.
56+
string item_id = 4;
57+
// Data bag item JSON data.
58+
google.protobuf.Struct data = 5;
4459
}

‎api/external/infra_proxy/response/databags.pb.go

+68-17
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

‎api/external/infra_proxy/response/databags.proto

+7
Original file line numberDiff line numberDiff line change
@@ -33,3 +33,10 @@ message CreateDataBagItem {
3333
// Data bag item ID.
3434
string id = 2;
3535
}
36+
37+
message UpdateDataBagItem {
38+
// Data bag name.
39+
string name = 1;
40+
// Data bag item ID.
41+
string item_id = 2;
42+
}

‎api/interservice/infra_proxy/request/databags.pb.go

+105-23
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

‎api/interservice/infra_proxy/request/databags.proto

+17-2
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@ syntax = "proto3";
33
package chef.automate.domain.infra_proxy.request;
44
option go_package = "github.com/chef/automate/api/interservice/infra_proxy/request";
55

6+
import "google/protobuf/struct.proto";
7+
68
message DataBags {
79
// Chef organization ID.
810
string org_id = 1;
@@ -39,6 +41,19 @@ message CreateDataBagItem {
3941
string server_id = 2;
4042
// Data bag name.
4143
string name = 3;
42-
// Data bag item stringify data.
43-
string data = 4;
44+
// Data bag item JSON data.
45+
google.protobuf.Struct data = 4;
46+
}
47+
48+
message UpdateDataBagItem {
49+
// Chef organization ID.
50+
string org_id = 1;
51+
// Chef Infra Server ID.
52+
string server_id = 2;
53+
// Data bag name.
54+
string name = 3;
55+
// Data bag item ID.
56+
string item_id = 4;
57+
// Data bag item JSON data.
58+
google.protobuf.Struct data = 5;
4459
}

‎api/interservice/infra_proxy/response/databags.pb.go

+69-17
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

‎api/interservice/infra_proxy/response/databags.proto

+6
Original file line numberDiff line numberDiff line change
@@ -34,3 +34,9 @@ message CreateDataBagItem {
3434
string id = 2;
3535
}
3636

37+
message UpdateDataBagItem {
38+
// Data bag name.
39+
string name = 1;
40+
// Data bag item ID.
41+
string item_id = 2;
42+
}

‎api/interservice/infra_proxy/service/infra_proxy.pb.go

+95-58
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

‎api/interservice/infra_proxy/service/infra_proxy.proto

+1
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,7 @@ service InfraProxy {
5959
rpc CreateDataBag (chef.automate.domain.infra_proxy.request.CreateDataBag) returns (chef.automate.domain.infra_proxy.response.CreateDataBag) {};
6060
rpc CreateDataBagItem (chef.automate.domain.infra_proxy.request.CreateDataBagItem) returns (chef.automate.domain.infra_proxy.response.CreateDataBagItem) {};
6161
rpc DeleteDataBag (chef.automate.domain.infra_proxy.request.DataBag) returns (chef.automate.domain.infra_proxy.response.DataBag) {};
62+
rpc UpdateDataBagItem (chef.automate.domain.infra_proxy.request.UpdateDataBagItem) returns (chef.automate.domain.infra_proxy.response.UpdateDataBagItem) {};
6263

6364
rpc GetEnvironments (chef.automate.domain.infra_proxy.request.Environments) returns (chef.automate.domain.infra_proxy.response.Environments) {};
6465
rpc GetEnvironment (chef.automate.domain.infra_proxy.request.Environment) returns (chef.automate.domain.infra_proxy.response.Environment) {};

‎components/automate-chef-io/data/docs/api_chef_automate/infra_proxy/infra_proxy.swagger.json

+102-2
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

‎components/automate-gateway/api/infra_proxy.pb.swagger.go

+102-2
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

‎components/automate-gateway/handler/infra_proxy/databags.go

+20
Original file line numberDiff line numberDiff line change
@@ -101,6 +101,26 @@ func (a *InfraProxyServer) CreateDataBagItem(ctx context.Context, r *gwreq.Creat
101101
}, nil
102102
}
103103

104+
// UpdateDataBagItem updates a data bag item
105+
func (a *InfraProxyServer) UpdateDataBagItem(ctx context.Context, r *gwreq.UpdateDataBagItem) (*gwres.UpdateDataBagItem, error) {
106+
req := &infra_req.UpdateDataBagItem{
107+
OrgId: r.OrgId,
108+
ServerId: r.ServerId,
109+
Name: r.Name,
110+
ItemId: r.ItemId,
111+
Data: r.Data,
112+
}
113+
res, err := a.client.UpdateDataBagItem(ctx, req)
114+
if err != nil {
115+
return nil, err
116+
}
117+
118+
return &gwres.UpdateDataBagItem{
119+
Name: res.GetName(),
120+
ItemId: res.GetItemId(),
121+
}, nil
122+
}
123+
104124
func fromUpstreamDataBags(dbags []*infra_res.DataBagListItem) []*gwres.DataBagListItem {
105125
ts := make([]*gwres.DataBagListItem, len(dbags))
106126

‎components/infra-proxy-service/server/databags.go

+95-14
Original file line numberDiff line numberDiff line change
@@ -12,17 +12,28 @@ import (
1212

1313
"github.com/chef/automate/api/interservice/infra_proxy/request"
1414
"github.com/chef/automate/api/interservice/infra_proxy/response"
15+
"github.com/chef/automate/components/infra-proxy-service/validation"
1516
)
1617

1718
// CreateDataBag creates a data bag
1819
func (s *Server) CreateDataBag(ctx context.Context, req *request.CreateDataBag) (*response.CreateDataBag, error) {
19-
c, err := s.createClient(ctx, req.OrgId, req.ServerId)
20+
err := validation.New(validation.Options{
21+
Target: "databag",
22+
Request: *req,
23+
Rules: validation.Rules{
24+
"OrgId": []string{"required"},
25+
"ServerId": []string{"required"},
26+
"Name": []string{"required"},
27+
},
28+
}).Validate()
29+
2030
if err != nil {
2131
return nil, err
2232
}
2333

24-
if req.Name == "" {
25-
return nil, status.Error(codes.InvalidArgument, "must supply data bag name")
34+
c, err := s.createClient(ctx, req.OrgId, req.ServerId)
35+
if err != nil {
36+
return nil, err
2637
}
2738

2839
_, err = c.client.DataBags.Create(
@@ -41,24 +52,31 @@ func (s *Server) CreateDataBag(ctx context.Context, req *request.CreateDataBag)
4152

4253
// CreateDataBagItem creates a data bag item
4354
func (s *Server) CreateDataBagItem(ctx context.Context, req *request.CreateDataBagItem) (*response.CreateDataBagItem, error) {
44-
c, err := s.createClient(ctx, req.OrgId, req.ServerId)
55+
err := validation.New(validation.Options{
56+
Target: "databag",
57+
Request: *req,
58+
Rules: validation.Rules{
59+
"OrgId": []string{"required"},
60+
"ServerId": []string{"required"},
61+
"Name": []string{"required"},
62+
},
63+
}).Validate()
64+
4565
if err != nil {
4666
return nil, err
4767
}
4868

49-
if req.Name == "" {
50-
return nil, status.Error(codes.InvalidArgument, "must supply data bag name")
69+
c, err := s.createClient(ctx, req.OrgId, req.ServerId)
70+
if err != nil {
71+
return nil, err
5172
}
5273

53-
data := DefaultIfEmpty(req.Data)
54-
55-
var dataBagItem chef.DataBagItem
56-
err = json.Unmarshal(json.RawMessage(data), &dataBagItem)
74+
dataBagItem, err := StructToJSON(req.Data)
5775
if err != nil {
5876
return nil, status.Error(codes.Internal, err.Error())
5977
}
6078

61-
err = c.client.DataBags.CreateItem(req.Name, dataBagItem)
79+
err = c.client.DataBags.CreateItem(req.Name, &dataBagItem)
6280
if err != nil {
6381
return nil, ParseAPIError(err)
6482
}
@@ -99,6 +117,21 @@ func (s *Server) GetDataBags(ctx context.Context, req *request.DataBags) (*respo
99117

100118
// GetDataBagItem get data bag
101119
func (s *Server) GetDataBagItem(ctx context.Context, req *request.DataBag) (*response.DataBag, error) {
120+
err := validation.New(validation.Options{
121+
Target: "databag",
122+
Request: *req,
123+
Rules: validation.Rules{
124+
"OrgId": []string{"required"},
125+
"ServerId": []string{"required"},
126+
"Name": []string{"required"},
127+
"Item": []string{"required"},
128+
},
129+
}).Validate()
130+
131+
if err != nil {
132+
return nil, err
133+
}
134+
102135
c, err := s.createClient(ctx, req.OrgId, req.ServerId)
103136
if err != nil {
104137
return nil, err
@@ -124,13 +157,23 @@ func (s *Server) GetDataBagItem(ctx context.Context, req *request.DataBag) (*res
124157

125158
// DeleteDataBag delete the data bag and data bag item
126159
func (s *Server) DeleteDataBag(ctx context.Context, req *request.DataBag) (*response.DataBag, error) {
127-
c, err := s.createClient(ctx, req.OrgId, req.ServerId)
160+
err := validation.New(validation.Options{
161+
Target: "databag",
162+
Request: *req,
163+
Rules: validation.Rules{
164+
"OrgId": []string{"required"},
165+
"ServerId": []string{"required"},
166+
"Name": []string{"required"},
167+
},
168+
}).Validate()
169+
128170
if err != nil {
129171
return nil, err
130172
}
131173

132-
if req.Name == "" {
133-
return nil, status.Error(codes.InvalidArgument, "must supply data bag name")
174+
c, err := s.createClient(ctx, req.OrgId, req.ServerId)
175+
if err != nil {
176+
return nil, err
134177
}
135178

136179
if req.Item != "" {
@@ -156,6 +199,44 @@ func (s *Server) DeleteDataBag(ctx context.Context, req *request.DataBag) (*resp
156199

157200
}
158201

202+
// UpdateDataBagItem updates a data bag item
203+
func (s *Server) UpdateDataBagItem(ctx context.Context, req *request.UpdateDataBagItem) (*response.UpdateDataBagItem, error) {
204+
err := validation.New(validation.Options{
205+
Target: "databag",
206+
Request: *req,
207+
Rules: validation.Rules{
208+
"OrgId": []string{"required"},
209+
"ServerId": []string{"required"},
210+
"Name": []string{"required"},
211+
"ItemId": []string{"required"},
212+
},
213+
}).Validate()
214+
215+
if err != nil {
216+
return nil, err
217+
}
218+
219+
c, err := s.createClient(ctx, req.OrgId, req.ServerId)
220+
if err != nil {
221+
return nil, err
222+
}
223+
224+
dataBagItem, err := StructToJSON(req.Data)
225+
if err != nil {
226+
return nil, status.Error(codes.Internal, err.Error())
227+
}
228+
229+
err = c.client.DataBags.UpdateItem(req.Name, req.ItemId, &dataBagItem)
230+
if err != nil {
231+
return nil, ParseAPIError(err)
232+
}
233+
234+
return &response.UpdateDataBagItem{
235+
Name: req.Name,
236+
ItemId: req.ItemId,
237+
}, nil
238+
}
239+
159240
// fromAPIToListDatabags a response.DataBags from a struct of DataBags
160241
func fromAPIToListDatabags(al chef.DataBagListResult) []*response.DataBagListItem {
161242
cl := make([]*response.DataBagListItem, len(al))

‎components/infra-proxy-service/server/proxy.go

+14
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,13 @@ package server
22

33
import (
44
"context"
5+
"encoding/json"
56
"net/http"
67
"net/url"
78

89
chef "github.com/go-chef/chef"
10+
jsonpb "github.com/golang/protobuf/jsonpb"
11+
structpb "github.com/golang/protobuf/ptypes/struct"
912
"github.com/pkg/errors"
1013
"google.golang.org/grpc/codes"
1114
"google.golang.org/grpc/status"
@@ -141,3 +144,14 @@ func DefaultIfEmpty(value string) string {
141144

142145
return value
143146
}
147+
148+
// StructToJSON convert the structpb to JSON interface object.
149+
func StructToJSON(data *structpb.Struct) (interface{}, error) {
150+
var v interface{}
151+
m := jsonpb.Marshaler{}
152+
153+
jsonStr, _ := m.MarshalToString(data)
154+
err := json.Unmarshal(json.RawMessage(jsonStr), &v)
155+
156+
return v, err
157+
}

0 commit comments

Comments
 (0)
Please sign in to comment.