Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 7 additions & 3 deletions environments.go
Original file line number Diff line number Diff line change
Expand Up @@ -28,9 +28,13 @@ func (s *EnvironmentsService) Get(ctx context.Context, name string) (*Environmen
}

// Create creates a new environment.
func (s *EnvironmentsService) Create(ctx context.Context, e *Environment) (*Environment, *Response, error) {
created, resp, err := s.res().create(ctx, e)
return ptrOrNil(created, err), resp, err
//
// The Chef Server answers POST /environments with {"uri":...} rather than the
// created object, so there is nothing to return but the response and any
// error.
func (s *EnvironmentsService) Create(ctx context.Context, e *Environment) (*Response, error) {
_, resp, err := s.res().create(ctx, e)
return resp, err
}

// Update replaces an existing environment.
Expand Down
2 changes: 1 addition & 1 deletion environments_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ func TestEnvironments_CRUD(t *testing.T) {
if err != nil || e.Name != "prod" || e.CookbookVersions["nginx"] != "= 1.2.0" {
t.Fatalf("Get: %+v %v", e, err)
}
if _, _, err := c.Environments.Create(ctx, &Environment{Name: "dev"}); err != nil {
if _, err := c.Environments.Create(ctx, &Environment{Name: "dev"}); err != nil {
t.Fatalf("Create: %v", err)
}
if _, _, err := c.Environments.Update(ctx, &Environment{Name: "prod"}); err != nil {
Expand Down
4 changes: 2 additions & 2 deletions integration/integration_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -71,7 +71,7 @@ func TestIntegration_NodeLifecycle(t *testing.T) {
// A real Chef server answers POST /nodes with {"uri": "..."} rather than
// the full node object, so the returned value is intentionally not asserted
// on here — creation is verified through the subsequent Get.
if _, _, err := c.Nodes.Create(ctx, &cinc.Node{
if _, err := c.Nodes.Create(ctx, &cinc.Node{
Name: "web01", Environment: "_default", RunList: []string{"recipe[nginx]"},
}); err != nil {
t.Fatalf("Create: %v", err)
Expand Down Expand Up @@ -114,7 +114,7 @@ func TestIntegration_Search(t *testing.T) {
c := newClient(t)
ctx := context.Background()
for _, name := range []string{"alpha", "beta", "gamma"} {
if _, _, err := c.Nodes.Create(ctx, &cinc.Node{Name: name, RunList: []string{}}); err != nil {
if _, err := c.Nodes.Create(ctx, &cinc.Node{Name: name, RunList: []string{}}); err != nil {
t.Fatalf("seed node %s: %v", name, err)
}
}
Expand Down
10 changes: 7 additions & 3 deletions nodes.go
Original file line number Diff line number Diff line change
Expand Up @@ -171,9 +171,13 @@ func (s *NodesService) Get(ctx context.Context, name string) (*Node, *Response,
}

// Create creates a new node.
func (s *NodesService) Create(ctx context.Context, n *Node) (*Node, *Response, error) {
created, resp, err := s.res().create(ctx, n)
return ptrOrNil(created, err), resp, err
//
// The Chef Server answers POST /nodes with {"uri":...} rather than the
// created object, so there is nothing to return but the response and any
// error.
func (s *NodesService) Create(ctx context.Context, n *Node) (*Response, error) {
_, resp, err := s.res().create(ctx, n)
return resp, err
}

// Update replaces an existing node.
Expand Down
21 changes: 19 additions & 2 deletions nodes_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ func TestNodes_Errors(t *testing.T) {
srv.Handle("POST /organizations/o/nodes",
cinctest.Route{Status: 409, Body: `{"error":["node already exists"]}`})
c := newTestClient(t, srv.Server)
_, _, err := c.Nodes.Create(context.Background(), &Node{Name: "dup"})
_, err := c.Nodes.Create(context.Background(), &Node{Name: "dup"})
if !errors.Is(err, ErrConflict) {
t.Fatalf("err = %v, want ErrConflict", err)
}
Expand Down Expand Up @@ -100,7 +100,7 @@ func TestNodes_CRUD(t *testing.T) {
n.Automatic.GetString("fqdn") != "web01.x" {
t.Fatalf("Get: %+v %v", n, err)
}
if _, _, err := c.Nodes.Create(ctx, &Node{Name: "web02"}); err != nil {
if _, err := c.Nodes.Create(ctx, &Node{Name: "web02"}); err != nil {
t.Fatalf("Create: %v", err)
}
if _, _, err := c.Nodes.Update(ctx, &Node{Name: "web01", Environment: "staging"}); err != nil {
Expand Down Expand Up @@ -155,3 +155,20 @@ func TestNode_RunListRoundTrips(t *testing.T) {
t.Errorf("round trip = %+v, want %+v", out, in)
}
}

// Chef answers POST /nodes with {"uri":...}, so there is no created node to
// return. Create reports only the response and any error.
func TestNodesCreate_ReturnsOnlyResponseAndError(t *testing.T) {
srv := cinctest.New(t)
srv.Handle("POST /organizations/o/nodes", cinctest.Route{
Status: 201, Body: `{"uri":"http://x/nodes/web02"}`,
})
c := newTestClient(t, srv.Server)
resp, err := c.Nodes.Create(context.Background(), &Node{Name: "web02"})
if err != nil {
t.Fatalf("Create: %v", err)
}
if resp.StatusCode != 201 {
t.Errorf("StatusCode = %d, want 201", resp.StatusCode)
}
}
10 changes: 7 additions & 3 deletions roles.go
Original file line number Diff line number Diff line change
Expand Up @@ -38,9 +38,13 @@ func (s *RolesService) Get(ctx context.Context, name string) (*Role, *Response,
}

// Create creates a new role.
func (s *RolesService) Create(ctx context.Context, r *Role) (*Role, *Response, error) {
created, resp, err := s.res().create(ctx, r)
return ptrOrNil(created, err), resp, err
//
// The Chef Server answers POST /roles with {"uri":...} rather than the
// created object, so there is nothing to return but the response and any
// error.
func (s *RolesService) Create(ctx context.Context, r *Role) (*Response, error) {
_, resp, err := s.res().create(ctx, r)
return resp, err
}

// Update replaces an existing role.
Expand Down
2 changes: 1 addition & 1 deletion roles_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ func TestRoles_CRUD(t *testing.T) {
if err != nil || r.Name != "web" || len(r.RunList) != 1 {
t.Fatalf("Get: %+v %v", r, err)
}
if _, _, err := c.Roles.Create(ctx, &Role{Name: "db"}); err != nil {
if _, err := c.Roles.Create(ctx, &Role{Name: "db"}); err != nil {
t.Fatalf("Create: %v", err)
}
if _, _, err := c.Roles.Update(ctx, &Role{Name: "web"}); err != nil {
Expand Down